64位双精度可以精确地表示整数/ - 253
鉴于这一事实,我选择将double类型用作所有类型的单一类型,因为我的最大整数是无符号32位 .
但现在我必须打印这些伪整数,但问题是它们也与实际双打混合在一起 .
那么如何在Java中很好地打印这些双打?
我已经尝试了 String.format("%f", value)
,这很接近,除了我得到很多小值的尾随零 .
这是 %f
的示例输出
232.00000000
0.18000000000
1237875192.0
4.5800000000
0.00000000
1.23450000
我想要的是:
232
0.18
1237875192
4.58
0
1.2345
当然,我可以编写一个函数来修剪这些零,但由于字符串操作,这会导致很多性能损失 . 我可以用其他格式代码做得更好吗?
EDIT
Tom E.和Jeremy S.的答案是不可接受的,因为它们都可以任意舍入到小数点后两位 . 请在回答之前先了解问题 .
EDIT 2
请注意 String.format(format, args...)
是 locale-dependent (见下面的答案) .
22 回答
使用
DecimalFormat
和setMinimumFractionDigits(0)
在我的机器上,以下函数大约比JasonD's answer提供的函数快7倍,因为它避免了
String.format
:这个将很好地完成工作,我知道这个话题很老,但在我遇到这个问题之前我一直在努力解决同样的问题 . 我希望有人觉得它很有用 .
我的2美分:
以下是实现它的两种方法 . 首先,更短(可能更好)的方式:
这是更长的,可能更糟的方式:
In short:
如果你想摆脱尾随零和Locale问题,那么你应该使用:
Explanation:
为什么其他答案不适合我:
如果double小于10 ^ -3或大于或等于10 ^ 7,则
Double.toString()
或System.out.println
或FloatingDecimal.toJavaFormatString
使用科学记数法%f
,默认小数精度为6,否则您可以对其进行硬编码,但如果您的小数位数较少,则会导致额外的零 . 示例:setMaximumFractionDigits(0);
或%.0f
删除任何小数精度,这对于整数/长整数是好的,但对于双精度则没有使用ENGLISH语言环境可确保在程序运行的任何位置获得小数点分隔符
为什么使用340然后
setMaximumFractionDigits
?两个原因:
setMaximumFractionDigits
接受一个整数,但其实现的最大允许位数为DecimalFormat.DOUBLE_FRACTION_DIGITS
,等于340Double.MIN_VALUE = 4.9E-324
所以有340位数字,你肯定不会绕过你的双精度和松散精度Naw,没关系 .
字符串操作导致的性能损失为零 .
这是在
%f
之后修剪结束的代码迟到但是......
你说你 choose 用双重类型存储你的号码 . 我认为这可能是问题的根源,因为它会强制您将整数存储为双精度(因此会丢失有关值的性质的初始信息) . 如何将数字存储在Number类(Double和Integer的超类)的实例中,并依靠多态来确定每个数字的正确格式?
我知道由于这个原因重构代码的整个部分可能是不可接受的,但它可以产生所需的输出而无需额外的代码/转换/解析 .
例:
将产生以下输出:
如果想要打印存储为双精度的整数,就像它们是整数一样,否则以最小必要精度打印双精度:
生产环境 :
而且不依赖于字符串操作 .
请注意
String.format(format, args...)
是 locale-dependent ,因为它使用用户的默认语言环境进行格式化,也就是说,可能使用逗号甚至内部空格如123 456,789或123,456.789,这可能与您的预期完全不同 .您可能更喜欢使用
String.format((Locale)null, format, args...)
.例如,
版画
这就是
String.format(format, args...)
在不同国家所做的事情 .编辑好了,因为有关于手续的讨论:
0表示最小位数
渲染#位数
我做了一个
DoubleFormatter
来有效地将大量的double值转换为一个漂亮/可呈现的String:如果V的整数部分超过MaxInteger =>以科学家格式显示V(1.2345e 30),否则以正常格式124.45678显示 .
MaxDecimal决定小数位数(与银行家的舍入修剪)
这里的代码:
注意:我使用了GUAVA库中的2个函数 . 如果您不使用GUAVA,请自行编码:
我知道这是一个非常古老的线程..但我认为最好的方法如下:
输出:
唯一的问题是最后一个.0没有被删除 . 但是,如果你能够忍受这种情况,那么这种方法效果最好 . %.2f会将其四舍五入到最后2位小数 . DecimalFormat也是如此 . 如果您需要所有小数位但不需要尾随零,则此方法效果最佳 .
我不得不使用这个原因
d == (long)d
在声纳报告中给了我违规这就是我提出的:
简单的一个班轮,只有演员如果真的需要到int
这是一个实际有效的答案(这里有不同答案的组合)
这将使字符串丢弃拖尾0-s .
正如评论中所指出的,这不是原始问题的正确答案 .
也就是说,这是一种非常有用的格式化数字的方法,没有不必要的尾随零 .
为什么不:
这应该与Double支持的极值一起使用 . 产量: