如何在 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 个数字。 floats通常精确到7到8位,而doubles通常精确到18位左右,所以我怀疑这些数字实际上是floats(或32位浮点数数字)被“扩大”为 doubles

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 位而产生的。