問題描述
我需要在Java中做一些浮點運算,如下代碼所示:
I need to do some floating point arithmetic in Java as shown in the code below:
public class TestMain {
private static Map<Integer, Double> ccc = new HashMap<Integer, Double>() {
{ put(1, 0.01); put(2, 0.02); put(3, 0.05); put(4, 0.1); put(6, 0.2);
put(10, 0.5); put(20, 1.0); put(30, 2.0); put(50, 5.0); put(100, 10.0);
}
};
Double increment(Double i, boolean up) {
Double inc = null;
while (inc == null) {
inc = ccc.get(i.intValue());
if (up)
--i;
else
++i;
}
return inc;
}
public static void main(String[] args) {
TestMain tt = new TestMain();
for (double i = 1; i < 1000; i += tt.increment(i, true)) {
System.out.print(i + ",");
}
}
}
這是為了模擬 Betfair 輸出的值范圍微調器小部件.
Java 中的浮點運算似乎引入了一些意想不到的錯誤.例如,我得到 2.180000000000001 而不是 2.18.浮點數有什么用,你不能相信對它們執行的算術結果?我該如何解決這個問題?
Floating point arithmetic in Java seems to introduce some unexpected errors. For example, I get 2.180000000000001 instead of 2.18. What use are floating point numbers is you can't trust the results of arithmetic performed on them? How can I get around this issue?
推薦答案
如果你需要精確的十進制值,你應該使用java.math.BigDecimal
.然后閱讀每個計算機科學家應該了解的浮點運算知識"了解您獲得這些結果的背景.
If you need exact decimal values, you should use java.math.BigDecimal
. Then read "What Every Computer Scientist Should Know About Floating-Point Arithmetic" for the background of why you're getting those results.
(我有一篇 .NET 中心文章,您可能會發現它更容易閱讀- 當然更短.Java 和 .NET 之間的差異對于理解這個問題來說幾乎是無關緊要的.)
(I have a .NET-centric article which you may find easier to read - and certainly shorter. The differences between Java and .NET are mostly irrelevant for the purposes of understanding this issue.)
這篇關于浮點運算不能產生精確的結果的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!