繁体   English   中英

使用println和printf进行不同的舍入

[英]Different rounding with println and printf

由于精度损失,下面的第一行将打印0.8999999999999999 ,这很清楚。 但第二行将打印0.9 ,我只是不明白为什么。 这个计算不应该有同样的问题吗?

System.out.println(2.00-1.10);
System.out.printf("%f",2.00-1.10);

此输出是由于浮动格式%fround half up操作的原因。 如果你浏览文档 ,那么你将获得

如果未指定precision,则默认值为6.如果精度小于Float.toString(float)或Double.toString(double)返回的字符串中小数点后面的位数, 然后使用圆半升算法对值进行舍入

我认为你缺少使用System.out.printf()的东西,如果你没有明确的格式化宽度,那么printf在C中的默认行为(如果没有明确指定,则为6位小数)

因此,如果您不指定%f任何数字,则默认情况下它只会打印1个字符。 但是,如果要更改小数点后的数字,则需要将其指定为%.2f ,这会将数字打印到2位小数。

所以它类似于写作

System.out.printf("%f",2.00-1.10);

要么

System.out.printf("%.1f",2.00-1.10);

由于float的格式说明符的一般语法是:

%[flags][width][.precision][argsize]typechar 

在旁注: -

此外,Java中还有一个格式化程序类

printf样式格式字符串的解释器。 此类提供对布局对齐和对齐的支持,数字,字符串和日期/时间数据的常用格式以及特定于语言环境的输出。 支持常见的Java类型,如byte,BigDecimal和Calendar。 通过Formattable接口提供对任意用户类型的有限格式自定义。

来自Oracle Docs

如果未指定精度,则默认值为6.如果精度小于Float.toString(float)或Double.toString(double)返回的字符串中小数点后面的位数,然后使用圆半升算法对值进行舍入。

根据我,格式%f打印1个字符。 它打印0.9的事实是标准的数学舍入行为

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM