在Java中,如何将浮点数的有效位截断为任意精度?

在Java中,如何将浮点数的有效位截断为任意精度?,java,floating-point,precision,ieee-754,Java,Floating Point,Precision,Ieee 754,我想在比较两个数字时引入一些人为的精度损失,以消除较小的舍入误差,这样我就不必在涉及x和y的每次比较中使用Math.absx-y

我想在比较两个数字时引入一些人为的精度损失,以消除较小的舍入误差,这样我就不必在涉及x和y的每次比较中使用Math.absx-y 本质上,我想要一种行为类似于将double向下转换为float,然后再向上转换为double的东西,除了我想要保留非常大和非常小的指数,我想要对保留的有效位的数量进行一些控制

给定以下函数,该函数生成64位IEEE 754数字有效位的二进制表示:

公共静态字符串有效位双d{ int符号_宽度=1; int EXP_WIDTH=11; int有效位_宽度=53; 字符串s=String.format%64s,Long.toBinaryStringDouble.doubleToRawLongBitsd.replace“”,“0”; 返回s.substring0+符号宽度,0+符号宽度+扩展宽度; } 我想要一个函数reducePrecisiondouble x,int位,它可以降低double有效位的精度,这样:

有效位减少精度X,位。子字符串位。相等字符串。格式%0+52-位+d,0 换言之,在reducePrecisionx有效位中的最高有效位之后的每一位,位应为0,而reducePrecisionx有效位中的最高有效位,位应该合理地近似于x的有效位中最重要的位。

假设x是您希望降低精度的数字,而位是您希望保留的有效位的数量


当位足够大且x的数量级足够接近0时,则x*1L a这不会“平滑”舍入误差;它使它们更大。这不是处理浮点运算中舍入错误的好方法。b将浮点数四舍五入到有效位中特定位数的方法是已知的。我们最近遇到了一个问题,对此我已经指出。我同意,降低精度总是会导致更大的误差。更好地描述这个目标应该是指定浮点数的任意二进制离散化。我现在确实看到这个问题是一个相当常见的问题的重复。我需要在谷歌fu上工作。