摘要:在里实现一个完美的,结果一不小心就掉进坑里。最后发现,并不是我们的代码有问题,也不是的。类型在构造时,数值就发生了变化实际上存储的是是浮点运算机制的锅。但的运算性能相对较差。完美的事情不存在的啊,不过百万次的计算量基本无差别,放心用。
在java里实现一个完美的round(),结果一不小心就掉进坑里。
第一直觉,好像用Math.round()就完事了吧,搞一个double的参数丢进去:Double dou = new Double(0.285); System.out.println(Math.round(dou*100)/100.0); 结果:0.28,扑街..好吧,用BigDecimal试一下:
BigDecimal bd = new BigDecimal(0.285); System.out.println(bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue()); 结果:0.28,再次扑街。
最后发现,并不是我们的代码有问题,也不是java的bug。
**BigDecimal类型在构造时,数值就发生了变化,实际上存储的是:** 0.284999999999999975575093458246556110680103302001953125 是浮点运算机制的锅。只要使用字符类型来初始化BigDecimal,以上问题就迎刃而解了。
BigDecimal bd = new BigDecimal("0.285"); System.out.println(bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue()); 但BigDecimal的运算性能相对较差。 完美的事情不存在的啊,不过百万次的计算量基本无差别,放心用。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75031.html
摘要:在中处理带小数的数据时,通常会碰到需要进行对数据进行四舍五入或者截取等操作。提供了一个的方法,很方便的帮助我们实现想要的操作。 在Java中处理带小数的数据时,通常会碰到需要进行对数据进行四舍五入或者截取等操作。BigDecimal提供了一个setScale()的方法,很方便的帮助我们实现想要的操作。 通常用到的是下面的方法 setScale(int newScale, in...
摘要:舍入方式需要弄明白自己的业务才用,别为了用而随便选一个用四舍五入模式从零四舍五入。原值结论都是向前进一位四舍五入到正无穷。 一:相除精度丢失的问题 BigDecimal的api除法相对加减乘要实现的复杂多了,只介绍常用的我遇到的问题: 问题:两数相除,如果9/3=3整除没问题,但是10/3=0.33333333......除不尽,这里不能让电脑一直除不尽,所以BigDecimal...
摘要:使用,保证精度的同时,能精准的进行四舍六入计算。类精确的数学运算使用来实现精准度因为精度的原因构造方法的结果有一定的不可预知性,例如因此建议使用。算法规则四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一。 四舍六入计算 算法规则: 四舍六入五考虑, 五后非零就进一, 五后皆零看奇偶, 五前为偶应舍去, 五前为奇要进一。 使用BigDecimal,保证精度的...
摘要:语言中给我们提供了专门用来操作这些数据的代码符号,统称为运算符。运算符的优先级运算符优先级决定一个表达式里术语的分组。一定的运算符比其他运算符拥有更高的优先级。 showImg(https://segmentfault.com/img/remote/1460000012983569?w=900&h=500); 在前面的内容已经学会了如何定义变量和初始化变量。定义变量的目的就是为了操作数...
摘要:整数除法对两个不能整除的整数做除法,就要面对舍入的问题。中的舍入除了缺省的舍入方式,还有多种舍入可供选择。就是说,我们输入的十进制数,在计算机内部都是用二进制来表示的。 关于除法,你也许觉得没什么值得谈论的,毕竟小学的时候体育老师就教过我们了。然而对于编程中使用的除法,我觉得还是有很多值得注意的细节的。为什么我想深究一下?因为我日常主要使用Java和Python编程,而它们的除法在细节...
阅读 1993·2021-11-15 11:38
阅读 2016·2019-08-30 15:55
阅读 2155·2019-08-30 15:52
阅读 3123·2019-08-30 14:01
阅读 2659·2019-08-30 12:47
阅读 1063·2019-08-29 13:17
阅读 1032·2019-08-26 13:55
阅读 2606·2019-08-26 13:46