使用double类型进行简单的运算,结果出现了很多位小数

原因: 二进制不能准确的表示十进制的浮点数. 由十进制转换二进制的方法可以知道: 如果最后一位不是0或5,长度是无限的.
解决: 转为bigdecimal进行运算.

再详尽一些的原因和示例: EffectiveJava中是这样写的.

第60条: 如果需要精确的答案,请避免使用float和double:

float double 类型主要是为了科学计算和工程计算而设计的 它们执行二进制浮点
运算( binary floating-point arithmetic ),这是为了在广泛的数值范围上提供较为精确的快速
近似计算而精心设计的 然而,它们并没有提供完全精确的结果,所以不应该被用于需要精
确结果的场合 float double 类型尤其不适合用于货币计算 ,因为要让一个 float
double 精确地表示 0.1 (或者 的任何其他负数次方值 )是不可能的
例如,假设你的口袋中有 $1.03 ,花掉了 42 之后还剩下多少钱呢?下面这个很简单的
程序片段试图回答这个问题:
System out.println( l.03 - 0 . 42 ) ;
遗憾的是,它输出的结果是 0. 6100000000000001 这并不是个别的例子 假设你的口
袋里有 $1 ,你买了 个垫圈,每个为 10 ¢ 那么应该找回多少零头呢?
System out.println(l.0- 9 * 0.10);
根据上述程序片段,你得到的是 $0.09999999999999998
你可能会认为,只要在打印之前将结果做 下舍人就可以解决这个问题,但遗憾的是,
这种做法并不总是可行的 例如,假设你的口袋里有 $1 ,你看到货架上有 美昧 的糖果,
标价分别为 10¢ 20¢ 30¢ ,等等,一直到 $1 你打算从标价为 10¢ 的糖果开始,每种买1
颗,一直到不能支付货架上下一种价格的糖果为止,那么你可以买多少颗糖果?还会找回多
少零头?下面是 个简单的程序,用来解决这个问题,示例略。
如果真正运行这个程序,你会发现可以支付 颗糖果,并且还剩下 $0.3999999999999999
这个答案是不正确的!解决这个问题的正确方法是使用 BigDecirnal int 或者 long 进行
货币计算
下面的程序是上一个程序的简单翻版,它使用 BigDecimal 类型代替 double
意,它使用了 BigDecimal String 构造器,而不是用 double 构造器 为了避免将不
正确的值引入到计算中,这是必需的: new BigDecimal (”1 . 00"),具体示例略
如果运行这个修改过的程序,会发现可以支付 颗糖果,还剩下 $0.00 这才是正确的
答案
然而,使用 BigDecimal 有两个缺点:与使用基本运算类型相比,这样做很不方便,
而且速度很慢 对于解决这样 个简单的问题,后 种缺点并不要紧 但是前 种缺点可能
会让你很不舒服
除了使用 BigDecimal 之外,还有一种办法是使用 int 或者 long ,到底选用 int
long 要取决于所涉及数值的大小,同时要自己处理十进制小数点,示例略。
总而言之,对于任何需要精确答案的计算任务,请不要使用 float 或者 double 如果
你想让系统来处理十进制小数点,并且不介意因为不使用基本类型而带来的不便,就请使用
BigDec mal 使用 BigDecimal 还有 些额外的好处,它允许你完全控制舍人,每当一
个操作涉及舍入的时候,你都可以从 种舍入模式中选择其- 如果你正通过合法强制的舍
入行为进行商务计算,使用 BigDecimal 是非常方便的 如果性能非常关键,并且你又不
介意自己处理十进制小数点,而且所涉及的数值又不太大,就可以使用 int 或者 long
果数值范围没有超过 位十进制数字,就可以使用工nt ;如果不超过 18 位数字,就可以使
long 如果数值可能超过 18 位数字,就必须使用 BigDecimal

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 两个 double 类型的数值可以是任何实数,可以是正数、负数或零,精度也可以是小数点后任意数的数字。 例如,以下是两个 double 类型的数值: 1.234567890 -0.987654321 这两个数值可以进行各种算术运算,例如加法、减法、乘法和除法。 ### 回答2: 两个`double`类型的数值可以是两个小数,或者是一小一大的数值。 `double`是Java中一种用于表示浮点数的数据类型,可以用于存储较大或较小的数值。 例如,可以有两个`double`类型的数值:3.14和2.718。第一个数值3.14是一个较小的小数,代表圆周率的近似值;第二个数值2.718是一个较大的小数,代表自然对数的底数的近似值。这两个数值都可以用`double`类型来表示和存储。 另一个例子是,可以有两个`double`类型的数值:1000000000.0和0.00000001。第一个数值1,000,000,000.0是一个较大的数,代表十亿;而第二个数值0.00000001是一个较小的数,代表0.00000001。这两个数值也可以用`double`类型来表示和存储。 总之,`double`类型的数值可以是小数或大数,可以用于存储范围较广的值,可以适用于很多计算和应用场景。 ### 回答3: 两个double类型的数值是指属于浮点数类型的两个数值。浮点数类型是一种用于存储带小数点的数值的数据类型,它可以表示较大范围的数值,并具有一定的精度。 举例来说,可以假设两个double类型的数值分别为3.14和2.71828。这两个数值都属于浮点数类型,因为它们带有小数点double类型的数值在计算机中的存储方式采用二进制浮点数,即将数值拆分成符号、指数和尾数,根据这三个部分来表示实际的数值。双精度浮点数(double)一般由64来表示,其中符号占用1,指数占用11,尾数占用52。 通过使用double类型的数值,我们可以进行各种数值计算操作,例如加法、减法、乘法、除法等。由于double类型具有较高的精度,可以满足大部分实际应用的需求。 需要注意的是,在进行浮点数的比较时需要小心,由于浮点数的存储方式存在一定的误差,相等的两个数值可能无法完全相等。因此,在比较double类型的数值时,一般会使用浮点数的精度误差范围进行比较,而非直接判断是否相等。 综上所述,两个double类型的数值是指属于浮点数类型的两个数值,它们可以进行各种数值计算操作,并通过浮点数的精度误差范围进行比较。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值