【发布时间】:2016-12-28 22:58:00
【问题描述】:
我陷入了以下场景:
如果 x 为 1.5 或更低,则最终结果将为 x = 1。 如果 x 大于 1.5,则 x = 2。
输入的数字将是 x/100。
例如: 输入 = 0.015 => x = 1.5 => 显示 x = 1。
我遇到的问题是浮点数不准确。例如: 输入 = 0.015 但实际上它类似于 0.01500000000000002。在这种情况下,x 将是 1.500000000000002,大于 1.5 => 显示输出为 x = 2。
它发生得如此随机,我不知道如何解决它。像 0.5 一样,1.5 会给我正确的结果。但是 2.5、3.5、4.5、5.5 会给我错误的结果。然后 6.5 将再次给我正确的结果。
我实现的代码如下:
float x = 0.015;
NumberFormat nf = DecimalFormat.getPercentInstance();
nf.setMaximumFractionDigits(0);
output = nf.format(x);
所以取决于 x,输出可能是对的,也可能是错的。就是这么随意。
我也尝试使用 Math.round、Math.floor、Math.ceils,但它们似乎都不起作用,因为浮点数是如此不可预测。
对解决方案有什么建议吗?
提前致谢。
【问题讨论】:
-
告诉我:多少
0.01500000000000002与0.01500000000000000不同?是不是微不足道? -
您是否尝试过 DecimalFormatter 将小数点后的数字限制为固定值? ...看到这个 - stackoverflow.com/questions/8895337/…
-
就是这样。浮点数和双精度值的行为方式是这样的,因为并非所有小数都可以精确表示。如果您需要精确表示小数部分(例如,对于货币值),您可以使用 BigDecimal(但计算速度要慢得多)。
-
和你在java中的round一样
-
嗡嗡声似乎很困惑。所以如果我使用 BigDecimal,我会得到确切的值吗?问题在于,对于相同的输入,iOS 会执行正确的结果,而 Android 有时会给出正确的结果。
标签: java android double decimal rounding