2 asderfzxcd asderfzxcd 于 2017.01.05 10:19 提问

double 0.1+0.2不等于0.3,等于0.3000000004

java double计算不准确,0.1+0.2不等于0.3,这个要怎么办,关于付款的计算

4个回答

Zhanjr
Zhanjr   2017.01.05 10:31

首先声明这不是bug,原因在与十进制到二进制的转换导致的精度问题!其次这几乎出现在很多的编程语言中:C、C++、Java、Javascript、Python中,准确的说:“使用了IEEE754浮点数格式”来存储浮点类型(float 32,double 64)的任何编程语言都有这个问题!

计算机将所有数据以二进制的形式存储
计算机用有限的大小来存储数据(因为现实生活中不存在无限大的内存或硬盘)

十进制的 0.1 转为二进制,得到一个无限循环小数:0.00011…。
也就是说,二进制无法「用有限的位数」来表示 0.1。对于 0.2 也是一样的,不赘述。二进制能「用有限的位数」表示的有:0.5、0.25、0.125 等。

但是计算机只能用有限的位数来存一个数,所以最终,计算机存的数是一个近似于 0.1 的小数。

确切的二进制值是0-01111111011-1001100110011001100110011001100110011001100110011010,
对应的十进制值是0.10000000000000000555...。

这是计算机能表示的最接近 0.1 的数字(存储一个数字的空间越大则越精确)。

所以当我们计算 0.1 + 0.2 时,实际上算的是两个近似值相加,得到的值当然也是近似等于 0.3。

keleguohn
keleguohn   2017.01.05 10:26

用这个对象BigDecimal

qq_29594393
qq_29594393   Ds   Rxr 2017.01.05 10:27

浮点数精度丢失,导致的误差 ,所有语言都是一样的,解决方法 ,可以先乘,变为整数。后面计算完,再除,变为小数 ,
或者使用取三位有效数字 ,由于误差 一般都是 0.000000000几 ,钱一般都是精确到分吧,后面的误差,会由于四舍五入 而抹去。

welan123123
welan123123   2017.01.05 11:04

使用BigDecimal对象是正解,百度百科上的例子就够你用了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!