Java中double相减精度的问题,和解决方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java中double相减精度的问题,和解决方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2626字,纯文字阅读大概需要4分钟。
内容图文
问题原因原帖1
解决方法:
使用BigDecimal方法来解决。
BigDecimal原理是什么?为什么它就没事?原理很简单。BigDecimal是不可变的,可以用来表示任意精度的带符号十进制数。double的问题是从小数点转换到二进制丢失精度,二进制丢失精度。BigDecimal在处理的时候把十进制小数扩大N倍让它在整数上进行计算,并保留相应的精度信息。至于BigDecimal是怎么保存的可以翻阅一下源代码。
/** * double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型 * 整型地方法适合于货币精度已知的情况,比如12.11+1.10转成1211+110计算,最后再/100即可 * 以下是摘抄的BigDecimal方法: */ public class DoubleUtils implements Serializable { privatestaticfinallong serialVersionUID = -3345205828566485102L; // 默认除法运算精度privatestaticfinal Integer DEF_DIV_SCALE = 2; /** * 提供精确的加法运算。 * * @param value1 被加数 * @param value2 加数 * @return 两个参数的和 */publicstatic Double add(Double value1, Double value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1)); BigDecimal b2 = new BigDecimal(Double.toString(value2)); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * * @param value1 被减数 * @param value2 减数 * @return 两个参数的差 */publicstaticdouble sub(Double value1, Double value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1)); BigDecimal b2 = new BigDecimal(Double.toString(value2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * * @param value1 被乘数 * @param value2 乘数 * @return 两个参数的积 */publicstatic Double mul(Double value1, Double value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1)); BigDecimal b2 = new BigDecimal(Double.toString(value2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。 * * @param dividend 被除数 * @param divisor 除数 * @return 两个参数的商 */publicstatic Double divide(Double dividend, Double divisor) { return divide(dividend, divisor, DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。 * * @param dividend 被除数 * @param divisor 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */publicstatic Double divide(Double dividend, Double divisor, Integer scale) { if (scale < 0) { thrownew IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(dividend)); BigDecimal b2 = new BigDecimal(Double.toString(divisor)); return b1.divide(b2, scale,RoundingMode.HALF_UP).doubleValue(); } /** * 提供指定数值的(精确)小数位四舍五入处理。 * * @param value 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */publicstaticdouble round(double value,int scale){ if(scale<0){ thrownew IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(value)); BigDecimal one = new BigDecimal("1"); return b.divide(one,scale, RoundingMode.HALF_UP).doubleValue(); } }
原文:https://www.cnblogs.com/MoonASixpence/p/14799847.html
内容总结
以上是互联网集市为您收集整理的Java中double相减精度的问题,和解决方法全部内容,希望文章能够帮你解决Java中double相减精度的问题,和解决方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。