Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打印带有更多小数点的浮点_Java_Floating Point_Decimal - Fatal编程技术网

Java 打印带有更多小数点的浮点

Java 打印带有更多小数点的浮点,java,floating-point,decimal,Java,Floating Point,Decimal,当我试图打印带有更多小数点的浮点数时,我遇到了一种非常奇怪的行为 Float price = Float.valueOf("1602.72"); System.out.println(price); //prints 1602.72 outputValue = String.format("%.6f", price); System.out.println(outputValue); //prints 1602.719971 我也使用了下面的代码,但得到了相同的结果 DecimalForm

当我试图打印带有更多小数点的浮点数时,我遇到了一种非常奇怪的行为

Float price = Float.valueOf("1602.72");
System.out.println(price); //prints 1602.72
outputValue =   String.format("%.6f", price);
System.out.println(outputValue); //prints 1602.719971
我也使用了下面的代码,但得到了相同的结果

DecimalFormat df = new DecimalFormat("0.000000");
System.out.println(df.format(price)); //prints 1602.719971
我期望输出值为
1602.720000
(小数点后的6位数字加上额外的零)

,这是因为

基本上,由于浮点数是用2的负幂表示的,因此一些十进制值很难准确表示(例如:如何将0.3写成2的幂和?)

您可以尝试
Float.valueOf(“1602.720000”)
Double.valueOf(“1602.72”)
(更好),但这些可能会有相同的问题

有关更详细的解释,请参阅答案。

发生这种情况的原因是

基本上,由于浮点数是用2的负幂表示的,因此一些十进制值很难准确表示(例如:如何将0.3写成2的幂和?)

您可以尝试
Float.valueOf(“1602.720000”)
Double.valueOf(“1602.72”)
(更好),但这些可能会有相同的问题


有关更详细的解释,请参阅答案。

切勿使用浮动或双精度表示价格,浮动和双精度是近似值,请参阅:

请看一看


编辑精确:使用浮点数或双精度表示小数是近似值。

切勿使用浮点数或双精度表示价格,浮点数和双精度表示近似值,请参阅:

请看一看


精确编辑:使用浮点数或双精度表示小数是一种近似值。

A
float
是数字的二进制表示法
(1/2^^?

比如:


将此二进制数相加以查找最接近的匹配项,结果将呈现。

A
float
是数字的二进制表示形式
(1/2^^?

比如:


结果是从这个二进制数的添加中找到最接近的匹配。

所以,没有方法来实现尾随零。即使它被专门为Android标记,也与此密切相关:所以,考虑使用。因此,没有方法在浮点和小数中进行。我现在将0附加到字符串。谢谢,没有实现尾随零点的方法,即使它是专门为Android标记的,也与此密切相关:所以,考虑使用。所以在浮点和十进制中没有方法。我现在将0附加到字符串。ThanksAll数值算法充其量只能近似于实数算法。认为BigDecimal不是近似值而二进制浮点是近似值是不正确的。例如,BigDecimal不能表示三分之一。正确的区别陈述是BigDecimal使用十进制基数,因此可以精确表示十进制数字,BigDecimal提供任意精度,而不是IEEE-754的固定精度。BigDecimal表示十进制数字,而不是实数,所以它不是近似值。问题是关于价格的,它也是十进制的,所以我们可以用BigDecimal精确地表示价格。这个三明治多少钱?6π$:D所以,是的,用BigDecimal表示实数是一个近似值,但我的答案是面向上下文的,自然语言是面向上下文的……如果BigDecimal不在近似值上,因为它表示十进制数,那么
float
double
就不是近似值,因为它们表示二进制数。BigDecimal和二进制浮点一样容易出错:如前所述,用BigDecimal中的1除以3会产生数学上不正确的结果。这意味着,如果商家提供“买二送一”交易,BigDecimal不能代表有效单价。好的,但问题的作者想代表价格!所以,小数。正如我的例子所指出的,价格并不总是小数。十进制也不能自动解决货币计算中的所有问题。认为二进制浮点运算只是一种近似,而BigDecimal则不是,这是一种误导。它们都是近似值,但它们是不同的近似值。因为你的答案表明一个是近似的,而另一个不是,这是误导。所有的数值运算充其量都是近似于真实的算术。认为BigDecimal不是近似值而二进制浮点是近似值是不正确的。例如,BigDecimal不能表示三分之一。正确的区别陈述是BigDecimal使用十进制基数,因此可以精确表示十进制数字,BigDecimal提供任意精度,而不是IEEE-754的固定精度。BigDecimal表示十进制数字,而不是实数,所以它不是近似值。问题是关于价格的,它也是十进制的,所以我们可以用BigDecimal精确地表示价格。这个三明治多少钱?6π$:D所以,是的,用BigDecimal表示实数是一个近似值,但我的答案是面向上下文的,自然语言是面向上下文的……如果BigDecimal不在近似值上,因为它表示十进制数,那么
float
double
就不是近似值,因为它们表示二进制数。BigDecimal和二进制浮点一样容易出错:如前所述,用BigDecimal中的1除以3会产生数学上不正确的结果。这意味着,如果商家提供“买二送一”交易,BigDecimal不能代表有效单价。好的,但问题的作者想代表价格!所以,小数。正如我的例子所指出的,价格并不总是小数。十进制也不能自动解决货币计算中的所有问题。认为二进制浮点运算只是一种近似,而BigDecimal则不是,这是一种误导。它们都是近似值,但它们是不同的近似值。因为你的答案表明一个是近似值,而另一个不是,这是误导。A
float1/2^1 = 0.5, 
1/2^2 = 0.25, 
1/2^3 = 0.125, 
1/2^4 = 0.0625, ...