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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
javascript中0.1 + 0.2 != 0.3?
javascript中0.1 + 0.2竟然与0.3不相等,这是BUG吗?
javascript为什么 0.1 + 0.2 = 0.30000000000000004
如果我问你 0.1 + 0.2 等于几?你可能会送我一个白眼,0.1 + 0.2 = 0.3 啊,那还用问吗?连幼儿园的小朋友都会回答这么小儿科的问题了。但是你知道吗,同样的问题放在编程语言中,或许就不是想象中那么简单的事儿了。不信?我们先来看一段 JS。var numA = 0.1; var numB = 0.2; alert( (numA + numB) === 0.3 ); 执行结果是 fa
揭秘 0.1 + 0.2 != 0.3(php 请自觉点用round)
原文转自:http://www.barretlee.com/blog/2016/09/28/ieee754-operation-in-js/ “0.1 + 0.2 = ?”,这道题如果给小学生,他会立马告诉你答案是 0.3,但是交给一些程序去计算,结果就不是那么简单了。 事实上,不仅仅是 JS,在其他采用 IEEE754 浮点数标准的语言中,0.1 + 0.2 都不会等于
0.1+0.2等于0.3吗
今天下午突然看到js中的精确度的问题然后自己私下研究了一下,当我打入如下代码 你会发现这段代码不会输出0.3,因为在js中这样是不会相等的,一会在解释,然后我又键入下列代码 发现这段代码能够完好的执行,并输出0.4,然后我就纳闷了,这是为什么然后看了一些资料,然后了解并解决了这种问题,真是当时计算机组成基础没有打好,然后查了一下用移码表示浮点数的问题 十进制0.1 二进制0.0
如何解决JavaScript中0.1+0.2不等于0.3
console.log(0.1+0.2===0.3);    //true or false?在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!==0.3,这是为什么呢?这个问题也会偶尔被用来当做面试题来考查面试者对JavaScript的数值的理解程度在JavaScript中的二进制的浮点数0.1和0.2并不是十分精确,在他们相加的结果并非...
Why 0.1 + 0.2 = 0.30000000000000004 in python ?
Why 0.1 + 0.2 = 0.30000000000000004 in python?python中:>>> 10.0 / 33.3333333333333335这是为了避免 0.3333… 一直循环下去,Python 武断终结了循环,但是,并没有按照“四舍五入”的原则终止。还会有更奇葩的:>>> 0.1 + 0.20.30000000000000004&...
JavaScript的设计缺陷?浮点运算:0.1 + 0.2 != 0.3
0.1 + 0.2 == 0.3 false 0.1 + 0.2 0.30000000000000004 很多人马上就开始认为JavaScript设计的不成熟,设计上有缺陷。实际上这并不是JavaScript仅有的问题,C/C++/Java甚至Matlab都有这个问题,参见: why 0.3-0.2-0.1 not equal to zero。这只是JavaScript遵循IE
javascript 二进制浮点数的问题,0.3-0.2不等于0.1
javascript 计算:0.4-0.3=?  0.3-0.2=?  0.2-0.1=? 先来看看实际效果: 编写javascript代码: 结果依次为: 以上就是二进制浮点数存在的问题,但是结果近似相等,只是在进行是否相等的判断时存在问题。
Java中 3*0.1 == 0.3 返回值 false ,1*0.3 == 0.3 返回值 true
Java中 3*0.1 == 0.3 返回值 false ,1*0.3 == 0.3 返回值 true 4*0.1 == 0.4 返回值 true
JAVA的面试题:0.3*3=0.899999999 , 不等于0.9
import java.math.BigDecimal; public class Test { public static void main(String[] args) { //错误的方式, double d1 = 0.3; int num = 3; System.out.println(d1 * num); //正确的方式 double d = 0.3;