public class doublePrecision {
public static void main(String[] args) {
double total = 0;
total += 5.6;
total += 5.8;
System.out.println(total);
}
}
上面的html" target="_blank">代码显示:
11.399999999999
我如何才能仅打印(或将其用作)11.4?
正如其他人提到的那样BigDecimal
,如果您想要精确表示为11.4,则可能要使用该类。
现在,对造成这种情况的原因进行一些解释:
Java中的float
和double
类型是浮点数,其中的数字以小数和指数的二进制表示形式存储。
更具体地说,双精度浮点值(例如doubletype)是64位值,其中:
1位表示符号(正或负)。
指数为11位。
52位为有效数字(小数部分为二进制)。
这些部分被组合以产生double值的表示。
(来源:维基百科:双精度)
有关Java中如何处理浮点值的详细说明,请参见Java语言规范的4.2.3节:浮点类型,格式和值。
byte,char,int,long
类型的定点数字,这是数字的精确representions。与定点数不同,浮点数有时(可以安全地假定为“大部分时间”)不能返回数字的精确表示形式。这就是为什么你最终的原因11.399999999999为的结果5.6 + 5.8。
当需要一个精确的值(例如1.5或150.1005)时,您将需要使用一种定点类型,该类型将能够精确表示该数字。
正如已经多次提到的,Java有一个BigDecimal可以处理非常大和非常小的数字的类。
从BigDecimal
该类的Java API参考中:
不变的,任意精度的带符号十进制数字。BigDecimal由任意精度的整数无标度值和32位整数标度组成。如果为零或正数,则小数位数是小数点右边的位数。如果为负,则数字的未标度值将乘以十,即标度取反的幂。因此,由BigDecimal表示的数字的值为(unscaledValue×10 ^ -scale)。
问题内容: 上面的代码打印: 我如何才能仅打印(或将其用作)11.4? 问题答案: 正如其他人所提到的,如果你想要精确表示为11.4,则可能要使用该类。 现在,对造成这种情况的原因进行一些解释: Java中的和类型是浮点数,其中的数字以小数和指数的二进制表示形式存储。 更具体地说,诸如类型的双精度浮点值是64位值,其中: 1位表示符号(正或负)。 指数为11位。 52位为有效数字(小数部分为二进制
问题内容: 我有一个原始浮点数,需要作为原始双数。简单地将浮标转换为两倍会给我带来额外的精度。例如: 但是,如果我不是强制类型转换,而是将浮点数输出为字符串,然后将字符串解析为双精度,那么我将得到所需的内容: 有没有比String返回更好的方法了? 问题答案: 这并不是说你实际上获得了更高的精度-而是浮标没有准确地代表你最初瞄准的数字。双被精确地表示原始浮子; 显示的是已经存在的“额外”数据。 例
我正在编写一个程序,打印浮点文字,以便在另一个程序中使用。 我需要打印多少位数才能保持原始浮点数的精度? 由于浮点数有十进制数字的精度,我最初的想法是打印8位数字应该足够了。但是,如果我运气不好,那会分布在7位有效数字的左侧和右侧,所以我应该打印9位十进制数字。 我的分析正确吗?9位十进制数字对所有情况都足够吗?如
问题内容: 显然已弃用。 考虑到JUnit的广泛使用,令人惊讶地缺少JUnit的javadocs。你能告诉我如何使用新的吗? 问题答案: Epsilon是您的“模糊因素”,因为双精度可能并不完全相等。Epsilon让您描述它们之间必须有多近。 如果您期望的是3.14159,但需要花费3.14059至3.14259(即0.001以内),那么您应该编写类似 (顺便说一句,22/7达到3.1428+,将
问题内容: 所以我想做的是将double转换为有理数。我检查小数点后有多少个数字,例如,我想将数字123.456保存为123456/1000。 但是,对于数字123.456,我得到了一个四舍五入的错误,结果是123455。我想可以用BigDecimal来解决这个问题,但我无法使其正常工作。同样,在计算出有理数之后,我想用参数(int numerator,int denominator)调用另一个构
程序是这样的。它的意思是根据工作时数、时薪、扣缴税款等来计算员工的净工资。它计算正确,但双点精度格式将最后一个小数四舍五入,失去了计算的准确性。 示例输入: } 请怜悯;我是一年级学生。