java - 在某些情况下,将 Long 乘以浮点数会导致错误
问题描述
请参阅下面的简单代码:
public static void main(String[] args) {
Long value = 91000L;
System.out.println(value * 0.1);
System.out.println(value * 0.2);
System.out.println(value * 0.3);
System.out.println(value * 0.4);
System.out.println(value * 0.5);
System.out.println(value * 0.6);
System.out.println(value * 0.7);
System.out.println(value * 0.8);
System.out.println(value * 0.9);
}
结果是这样的:
9100.0
18200.0
27300.0
36400.0
45500.0
54600.0
63699.99999999999 //incorrect!
72800.0
81900.0
解决方案
这是一个正确的结果,因为使用 double 并不像使用整数类型那样精确。
这就是为什么如果你比较两个double
数字,你必须这样做。像这样:
public static boolean isEqual(double one, double two) {
return one >= two - 1E6 && one <= two + 1E6;
}
如果要打印正确的值,则必须使用BigDecimal
:
BigDecimal val = BigDecimal.valueOf(91000);
BigDecimal res = val.multiply(BigDecimal.valueOf(0.7));
System.out.println(res); // 63000.0
在某些情况下,您可以提高精度:
long value = 91000L;
System.out.println(value * 0.7); // 63699.99999999999
System.out.println((value * 7) / 10); // 63700
推荐阅读
- angular - 500(内部服务器错误)角度删除 api
- ramda.js - 函数式编程 RamdaJs arity 问题
- reactjs - TypeError:instance.render 不是函数
- java - FXGL:弃用警告导致 kotlin.UninitializedPropertyAccessException?
- c# - 无法在 VS19 中加载 LLBL Gen Pro 的自定义可视化工具
- c# - 使用本地数据库,无需最终用户下载 LocalDB
- javascript - discord.js 带有自己编码的音乐机器人的奇怪错误。在 PC 上有效,在 V-Server 上无效
- nginx - 将 URL www.domain.com/ru_en/test/test 重写为 www.domain.com/ru/en/test/test
- python - 视图中缺少树的子级条目
- arrays - 如何改进我的代码以在字符串中查找重播?