如何在java中故意创建随机浮点/十进制精度错误?

如何在java中故意创建随机浮点/十进制精度错误?,java,random,floating-point,double,precision,Java,Random,Floating Point,Double,Precision,我的目标是生成具有十进制精度错误的随机数 以下是我想生成的数字类型的一些示例: 1.8181818723678589 1.2727272510528564 0.444444477558136 以下是我尝试过的策略 parseFloat(“4.01500000000000000001”) BigDecimal.valueOf(ThreadLocalRandom.current().nextFloat()).multiply(BigDecimal.valueOf(ThreadLocalRandom

我的目标是生成具有十进制精度错误的随机数

以下是我想生成的数字类型的一些示例:

1.8181818723678589
1.2727272510528564
0.444444477558136
以下是我尝试过的策略

parseFloat(“4.01500000000000000001”)
BigDecimal.valueOf(ThreadLocalRandom.current().nextFloat()).multiply(BigDecimal.valueOf(ThreadLocalRandom.current().nextFloat()).doubleValue()


我尝试过的所有东西都没有创建一个与我正在寻找的数字相似的数字。

假设实际值为:

  • 1.81重复
  • 1.27重复
  • 0.4重复
请注意,每个数字中大约有7或8个数字是“正确的”,总共大约有18个数字
float
s通常精确到7到8位,而
double
s通常精确到18位左右,因此我怀疑这些数字实际上是
float
(或32位浮点数),被“加宽”为
double
s

1.81重复是20/11,所以我试着:

float i = 20f/11f;
double d = i;
System.out.println(d);
这将精确打印您看到的值-1.81818723678589


1.27重复是14/11,0.4重复是4/9。这两种你自己都可以试试。它们都会产生你想要的数字。这强烈表明错误是通过将浮点扩大到64位而产生的。

因此,基本上,您希望小数位数在一段时间内保持规则,然后变得不规则?@Sweeper我认为所有这些数字都有某种小数点错误。我从测试不同的触摸事件(如touch.radiusX touch.radiusY)中发现了这些数字。我想学习如何在数学上创建类似于这些事件的舍入错误。听起来你在使用某种UI框架?如果您可以查看他们的源代码,您应该能够准确地看到如何计算
radiusX
radiusY
。总之,一般来说,错误会累积,所以只要你做足够的计算,你就会看到它们。尝试将100个0.1相加(全部
float
s),得到10.000002。这就是你想要的错误吗?不要使用
BigDecimal
,因为它准确地表示事物-与您想要的正好相反。@Sweeper我通过在屏幕上按从手机上的Chrome获得这些数字。我在下面放了一个链接。我还将检查铬源,看看这是如何计算的。真棒!非常感谢。