zoukankan      html  css  js  c++  java
  • int变量与double变量混合运算时的常见问题及方法

    int变量与double变量混合运算时的常见问题及方法

     

    int变量与double变量混合运算时的常见问题及方法

    例:

    例:

    很明显这都不是我们需要的答案,原因:

    1)由于计算机内部以二进制保存,所以十进制的有限位的小数,在计算机内部会是一个无限位的小数。
    例如 十进制的0.9虽然只有一位小数,转成2进制是无限循环小数0.1110011001100110011...

    2)计算机保存浮点数的精度有限,例如float可以保留十进制最多7位(二进制23位)有效数字,double 可以保留十进制15~16位(二进制52位)有效数字。那有效数字以后的就被忽略了。
    例如上面的0.9的表示受精度所限,精度以后的就被忽略了,这样
    float时,它是0.89999998
    double时,它是0.90000000000000002

    解决办法:用Java提供给我们的一个内置类java.math.BigDecimal,来精确计算。

    下面是这个工具类的使用方法:

    1 public class Arith {
    2 /**
    3 * 提供精确加法计算的add方法
    4 * @param value1 被加数
    5 * @param value2 加数
    6 * @return 两个参数的和
    7 */
    8 public static double add(double value1,double value2){
    9 BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
    10 BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
    11 return b1.add(b2).doubleValue();
    12 }
    13
    14 /**
    15 * 提供精确减法运算的sub方法
    16 * @param value1 被减数
    17 * @param value2 减数
    18 * @return 两个参数的差
    19 */
    20 public static double sub(double value1,double value2){
    21 BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
    22 BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
    23 return b1.subtract(b2).doubleValue();
    24 }
    25
    26 /**
    27 * 提供精确乘法运算的mul方法
    28 * @param value1 被乘数
    29 * @param value2 乘数
    30 * @return 两个参数的积
    31 */
    32 public static double mul(double value1,double value2){
    33 BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
    34 BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
    35 return b1.multiply(b2).doubleValue();
    36 }
    37
    38 /**
    39 * 提供精确的除法运算方法div
    40 * @param value1 被除数
    41 * @param value2 除数
    42 * @param scale 精确范围
    43 * @return 两个参数的商
    44 * @throws IllegalAccessException
    45 */
    46 public static double div(double value1,double value2,int scale) throws IllegalAccessException{
    47 //如果精确范围小于0,抛出异常信息
    48 if(scale<0){
    49 throw new IllegalAccessException("精确度不能小于0");
    50 }
    51 BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
    52 BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
    53 return b1.divide(b2, scale).doubleValue();

     

     

  • 相关阅读:
    (LeetCode 141/142)Linked List Cycle
    (算法)随机播放歌曲
    (数组)数组排序,使所有奇数在左边,所有偶数在右边
    遗失的乔布斯访谈(文字版)
    幻想·梦想·理想
    立刻辞职,时不我待
    彩票漏洞让你快速致富
    剪刀石头布常胜秘笈
    9个心理学研究,让你学习更高效
    石头剪刀布手套:不止是寂寞宅的消遣
  • 原文地址:https://www.cnblogs.com/fgy11/p/12782434.html
Copyright © 2011-2022 走看看