- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个应用程序来计算百分比分数平均值,但问题是 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
进行计算,而不仅仅是用于舍入。
含义,mark1
、mark2
、percent1
、percent2
和 average
应该是 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/
我似乎无法理解使用十进制类将 2.775 舍入为 2.78 的十进制文档。 import decimal decimal.getcontext().prec = 7 print(decimal.Dec
我正在创建一个应用程序来计算百分比分数平均值,但问题是 BigDecimal 并不总是对平均值进行舍入,例如,如果比例 1 中的分数平均值为 3.85 BigDecimal ROUND_HALF_UP
任何人都可以解释或提出修复,为什么当我在 Python 3 中将小数舍入为四舍五入时,它会将 2.5 舍入为 2,而在 Python 2 中它会正确舍入为 3: Python 3.4.3 和 3.5.
首先我想提一下这个问题不是重复的: Python Rounding Inconsistently Python 3.x rounding behavior 我知道 IEEE 754,我知道: The
我正在尝试使用 Decimal.quantize() 来实现以下目标:- 对于任何金额,以默认精度的 python 小数表示,我想使用 decimal.ROUND_HALF_UP 对其进行四舍五入,以
以下: new MathContext(precision, RoundingMode.HALF_UP); 似乎有效。但是,以下返回错误: new MathContext(precision, Big
我正在尝试对 BigDecimal 类实现新的成绩舍入,但我遇到了一个可能的错误,可能是我做错了什么。下面的代码暴露了我的问题: public static void main(String[] ar
ruby 是否有与 Java 的 BigDecimal.setScale(6, Round_half_up) 等效的内置函数?我需要从 float 中取 6 个十进制值,并根据小数点后的 7 个值对其
谁能解释一下为什么第一行的结果是 0? System.out.println((new BigDecimal("1.0E+8")).divide(new BigDecimal(100000000),
我一直在使用 BigDecimal 来获取价格,但我想知道向用户展示它的最佳方式是什么。 使用 doubleValue() 是一种好方法吗? 这两个选项之间有什么区别吗? 最佳答案 Is using
我尝试了以下, double doubleVal = 1.745; double doubleVal1 = 0.745; BigDecimal bdTest = new BigDec
我是一名优秀的程序员,十分优秀!