[英]How to avoid floating point precision errors with floats or doubles in Java?
[英]How can I intentionally create random floating point / decimal precision errors in java?
我的目標是生成所有具有小數精度錯誤的隨機數。
以下是我想生成的數字類型的一些示例:
1.8181818723678589
1.2727272510528564
0.444444477558136
以下是我嘗試過的策略。
parseFloat("4.01500000000000000001");
BigDecimal.valueOf(ThreadLocalRandom.current().nextFloat()).multiply(BigDecimal.valueOf(ThreadLocalRandom.current().nextFloat())).doubleValue();
我嘗試過的所有事情都沒有創建一個與我正在尋找的數字相似的數字。
假設實際意味着的確切值是:
請注意,在每個數字中,大約有 7 或 8 位數字是“正確的”,總共大約 18 位數字。 float
s 通常精確到 7 到 8 位,而double
s 通常精確到 18 位左右,所以我懷疑這些數字實際上是floats
(或 32 位浮點數),它們被“擴大”為double
s
1.81 重復是 20/11,所以我嘗試了:
float i = 20f/11f;
double d = i;
System.out.println(d);
這將准確打印您看到的值 - 1.8181818723678589。
1.27 重復是 14/11,0.4 重復是 4/9。 您可以自己嘗試這兩種方法。 它們都會產生您想要的數字。 這強烈表明錯誤是通過將float
擴大到 64 位產生的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.