所以我正在使用一些模数,我很困惑为什么当我做
.3%.1
我得到了
0.09999999999999998
而不是0 ...我该如何解决这个问题?
答案 0 :(得分: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
答案 1 :(得分:0)
最接近0.03的两倍是0.0299999999999999988897769753748434595763683319091796875,最接近0.01的两倍是0.01000000000000000020816681711721685132943093776702880859375
略微小于0.03模数稍微大于0.01的东西必须导致值略小于0.01。
没有精确浮点表示的数字同样可能由稍微小或稍微大的东西表示。这可以很好地进行舍入,但是对于地板,天花板和类似操作(包括模数)会产生不方便的结果,其中差异较小的值的处理方式非常不同。
如前所述,如果精确处理小数部分特别重要,请使用BigDecimal或以10的幂进行缩放并执行整数运算。否则,请提供有关模运算的上下文和原因的更多信息。
答案 2 :(得分:-1)
你可以尝试这个 - :
System.out.println((int)(.3%.1));
这会将o/p
打印为0
。
原因是因为您正在进行浮点运算,结果是浮点数。