double s = 5.3;double s1 = 4.2;System.out.println(s-s1);输出1.0999999999999996
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
Java基本数据类型中的float、double类型的实质是浮点数,浮点数不能存储精确的数据,这样的话,浮点数在进行计算的时候,计算结果就不是精确的值;
因此,Java提供了一个类BigDecimal,如果需要进行精确的数据运算(比如金额),就可以使用该类,这叫曲线救国...
BigDecimal
关于浮点数的底层实现及其原理,这个在计算机原理之类的课程里经常讲到,可以自行查找相关的资料...
计算机原理
Java中使用BigDecimal进行浮点数精确计算
谢邀!为什么丢失精度我也说不清,但是怎么解决我是知道的,建议在计算时先把 double 等类型转为 String 再放到 java.math.BigDecimal 中去进行计算,在计算的时候要使用 java.math.BigDecimal自带的运算方法,比如 add() ,pide()。。等等,计算后也会返回一个 BigDecimal 的对象,然后再使用 doubleValue(), intValue() 等方法转为基本数据类型。
谢邀,这个问题可以参考这篇文章https://zm8.sm-tc.cn/?src=http%3A%2F%2Fz...
因为计算机算术是二进制的。
十进制的0.1变成二进制是无限循环小数,肯定得截断。
对10进制货币的加减,可以用BigDecimal类型(有的语言叫Decimal)避免截断误差。
也可以自己定义一个数字类,像matlab做的那样。
错误和误差是两回事,最末尾的那点区别,大部分情况都没关系吧。
举个例子:用双精度浮点数计算地球周长,截断误差在0.000001毫米数量级,有关系么?
Java基本数据类型中的float、double类型的实质是浮点数,浮点数不能存储精确的数据,这样的话,浮点数在进行计算的时候,计算结果就不是精确的值;
因此,Java提供了一个类
BigDecimal
,如果需要进行精确的数据运算(比如金额),就可以使用该类,这叫曲线救国...关于浮点数的底层实现及其原理,这个在
计算机原理
之类的课程里经常讲到,可以自行查找相关的资料...Java中使用BigDecimal进行浮点数精确计算
谢邀!为什么丢失精度我也说不清,但是怎么解决我是知道的,建议在计算时先把 double 等类型转为 String 再放到 java.math.BigDecimal 中去进行计算,在计算的时候要使用 java.math.BigDecimal自带的运算方法,比如 add() ,pide()。。等等,计算后也会返回一个 BigDecimal 的对象,然后再使用 doubleValue(), intValue() 等方法转为基本数据类型。
谢邀,这个问题可以参考这篇文章https://zm8.sm-tc.cn/?src=http%3A%2F%2Fz...
因为计算机算术是二进制的。
十进制的0.1变成二进制是无限循环小数,肯定得截断。
对10进制货币的加减,可以用BigDecimal类型(有的语言叫Decimal)避免截断误差。
也可以自己定义一个数字类,像matlab做的那样。
错误和误差是两回事,最末尾的那点区别,大部分情况都没关系吧。
举个例子:用双精度浮点数计算地球周长,截断误差在0.000001毫米数量级,有关系么?