如何在 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();
None 我试过的东西甚至创造了一个与我正在寻找的相似的数字。
假设 意味着 的确切值是:
- 1.81 重复
- 1.27 重复
- 0.4 次重复
观察每个数字中大约有 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 位而产生的。
我的目标是生成所有具有小数精度误差的随机数。
以下是我想要生成的数字类型的一些示例:
1.8181818723678589
1.2727272510528564
0.444444477558136
以下是我尝试过的策略。
parseFloat("4.01500000000000000001");
BigDecimal.valueOf(ThreadLocalRandom.current().nextFloat()).multiply(BigDecimal.valueOf(ThreadLocalRandom.current().nextFloat())).doubleValue();
None 我试过的东西甚至创造了一个与我正在寻找的相似的数字。
假设 意味着 的确切值是:
- 1.81 重复
- 1.27 重复
- 0.4 次重复
观察每个数字中大约有 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 位而产生的。