gpt4 book ai didi

java - BigDecimal 使用 ROUND_HALF_UP 舍入不好

转载 作者:行者123 更新时间:2023-12-02 05:38:00 24 4
gpt4 key购买 nike

我正在创建一个应用程序来计算百分比分数平均值,但问题是 BigDecimal 并不总是对平均值进行舍入,例如,如果比例 1 中的分数平均值为 3.85 BigDecimal ROUND_HALF_UP 应舍入为 3.9,但它显示平均值像 3.8 一样,这种情况只发生在一些特定的时间,有时 BigDecimal 围绕 4.95 像 5.0 一样,它很好,但我不知道为什么会发生以及问题出在哪里。这是一个示例代码,您可以看到问题:

import java.io.*;
import java.math.BigDecimal;


public class Main {

public static void main(String[] args) throws IOException{
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader buff = new BufferedReader (input);

//temporal
float average=0;
float mark1=0;
float mark2=0;
float percent1=0.75f;
float percent2=0.25f;

for(int i=0;i<1;i++){
System.out.println("Enter mark 1 (75%) : ");
mark1=Float.parseFloat(buff.readLine());

}

for(int i=0;i<1;i++){
System.out.println("Enter mark 2 (25%): ");
mark2=Float.parseFloat(buff.readLine());

}

average= ((mark1*percent1)+(mark2*percent2));
// convert to BigDecimal
BigDecimal bd = new BigDecimal(average);

BigDecimal roundingMark = bd.setScale(1,
BigDecimal.ROUND_HALF_UP);

System.out.println(" the complete average is :"+average);
System.out.println(" The rounding average is :"+roundingMark);
}


}

您应该在第一个标记中输入 4.5,在第二个标记中输入 1.9,结果将为 3.8,并且应该为 3.9

请原谅我的英语不好,非常感谢您的阅读:)

最佳答案

您应该使用BigDecimal进行计算,而不仅仅是用于舍入。

含义,mark1mark2percent1percent2average 应该是 BigDecimal。您在这里面临的问题是 precision problem :float不够精确,无法保证计算的准确性,所以你认为应该是3.85的实际上是3.849999999999。尝试打印bd,你会发现它的原始值是849999904632568359375(至少这对我来说是准确的值)。

编辑,扩展:我刚刚想到你可能也误解了 ROUND_HALF_UP 的含义。我从文档中引用

Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. Behaves as for ROUND_UP if the discarded fraction is ≥ 0.5; otherwise, behaves as for ROUND_DOWN. Note that this is the rounding mode that most of us were taught in grade school.

因此,总结精度问题,导致 bd 的实际值更接近 3.8 而不是 3.9,以及预期的行为ROUND_HALF_UP 后,您现在应该对结果有了完整的解释。

关于java - BigDecimal 使用 ROUND_HALF_UP 舍入不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24788707/

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