gpt4 book ai didi

Java 浮点精度问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:38:11 25 4
gpt4 key购买 nike

我对 Java 中的浮点运算及其精度有疑问。我确实在这里和通过谷歌进行了研究,并遇到了一些解决方案,但在我的设计中实现它们时遇到了困难。所以在 Java 中,我使用 BigDecimal 类来使我的计算准确。请注意,变量是 double 的,并且在进行计算时,值的精度最多可以向右小数点后 8 位。要显示的结果(精度)是已知的,这就是我将存储为当前值的内容。此外,所有值都是动态输入的(通过一种方法)。传递的参数应该是 currentValue + 步长。

public void newValue(float value) {

//Clip to valid range, can't go over minimum/max value
value = Math.max(minimumValue, Math.min(maximumValue, value));

// TODO Implement better Floating Point Arithmetic precision

MathContext mcI = new MathContext(0, RoundingMode.HALF_UP);
MathContext mcF = new MathContext(8, RoundingMode.HALF_UP);
BigDecimal valueBD = new BigDecimal(value, mcF);
BigDecimal minimumBD = new BigDecimal(minimumValue, mcF);
BigDecimal stepBD = new BigDecimal(step, mcF);
BigDecimal currentValueBD = new BigDecimal(currentValue, mcF);


BigDecimal totalStepsBD = valueBD.subtract(minimumBD, mcF);

//Ensure value is divisible by stepsize
totalStepsBD = totalStepsBD.divide(stepBD, mcI);

valueBD = stepBD.multiply(totalStepsBD, mcF);

valueBD = valueBD.add(minimumBD, mcF);

// arithmetic without using BigDecimal (old)
//int totalSteps = (int) ((value- minimumValue)/ step);
//value = totalSteps * step + minimumValue;

if(!(valueBD.equals(currentValueBD))) {
valueBD = valueBD.setScale(displayPrecision, RoundingMode.HALF_UP);
currentValue = valueBD.floatValue();
dispatch();
}

现在,它适用于一些值,但不是全部。特别是当我弄乱步长时。所以如果 step = 0.1 就没问题。如果我把它设为 0.005,我会得到一个 AirthmeticException - 在步骤中不终止十进制扩展

totalStepsBD = totalStepsBD.divide(stepBD, mcI);

当为 step 变量设置 .005 时,在生成 BigDeciaml (stepBD) 后,结果为 .0049999999... 不确定这是否有帮助,但如果您有任何想法,请告诉我。谢谢。

最佳答案

String 步骤(和 String 值)传递给 BigDecimal 构造函数。您不能将 0.005 精确表示为 double(或 float)。

 BigDecimal stepBD = new BigDecimal("0.005"); // <-- works as a `String`.

编辑

或如下所述,使用 BigDecimal.valueOf(double)

 BigDecimal stepBD = BigDecimal.valueOf(0.005);

关于Java 浮点精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27567639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com