【发布时间】:2015-02-03 06:21:59
【问题描述】:
所以我正在使用一些模数,我很困惑为什么我这样做
.3%.1
我明白了
0.09999999999999998
而不是 0... 我该如何解决这个问题?
【问题讨论】:
-
0.3 和 0.1 都不能用 float 或 double 表示
-
看不到您的代码,我们无能为力。
所以我正在使用一些模数,我很困惑为什么我这样做
.3%.1
我明白了
0.09999999999999998
而不是 0... 我该如何解决这个问题?
【问题讨论】:
考虑BigDecimal:
不可变的、任意精度的有符号十进制数。
这可以准确表示您的值。 floating point values is because they aren't exact 不起作用(如您所料)的原因。
所以使用 BigDecimal API,
BigDecimal n1 = new BigDecimal("0.3");
BigDecimal n2 = new BigDecimal("0.1");
BigDecimal r = n1.remainder(n2);
System.out.println(r);
输出:
0.0
【讨论】:
最接近 0.03 的双倍是 0.0299999999999999988897769753748434595763683319091796875 和最接近 0.01 的双倍是 0.010000000000000000208166817117397651328808073976513288050>
将略小于 0.03 的值以略大于 0.01 的模数减少一定会导致值略小于 0.01。
不具有精确浮点表示的数字同样可能由稍小或稍大的东西表示。这适用于四舍五入,但可能会导致不方便的结果与地板、天花板和类似运算,包括模数,其中具有微小差异的值的处理方式非常不同。
如前所述,如果精确处理小数部分特别重要,请使用 BigDecimal 或按 10 的幂进行缩放并进行整数运算。否则,请提供有关模运算的上下文和原因的更多信息。
【讨论】:
你可以试试这个-:
System.out.println((int)(.3%.1));
这会将o/p 打印为0。
原因是因为你在做浮点运算,结果是一个浮点数。
【讨论】: