如何在Java中格式化数字并保留小数?

如何在Java中格式化数字并保留小数?,java,format,Java,Format,我试图将毫秒显示为秒,同时保留小数,例如,我有1234毫秒,我想将其显示为1.234秒 Decimal duration = 1234; NumberFormat formatter = new DecimalFormat("#0.000"); String durationStr = formatter.format(duration / 1000); 有什么建议吗?用双精度除以数字1000d 用一个double除以数字1000d 听起来您应该使用BigDecimal-从长文本中创建一个Bi

我试图将毫秒显示为秒,同时保留小数,例如,我有1234毫秒,我想将其显示为1.234秒

Decimal duration = 1234;
NumberFormat formatter = new DecimalFormat("#0.000");
String durationStr = formatter.format(duration / 1000);

有什么建议吗?

用双精度除以数字1000d


用一个double除以数字1000d


听起来您应该使用BigDecimal-从长文本中创建一个BigDecimal,然后将其缩放3位:

BigDecimal bd = new BigDecimal(duration).scaleByPowerOfTen(-3);
String durationStr = formatter.format(bd);
通过使用BigDecimal而不是double,您知道您仍然可以得到您真正考虑的值,而不仅仅是double可以保持的最接近的近似值

您可能还需要:

formatter.setMinimumFractionDigits(3);
formatter.setMaximumFractionDigits(3);

。。。以确保始终获得精确的5位数。例如,假设您希望1秒为1.000。

听起来您应该使用BigDecimal-从长数值中创建一个BigDecimal,然后将其缩放3位:

BigDecimal bd = new BigDecimal(duration).scaleByPowerOfTen(-3);
String durationStr = formatter.format(bd);
通过使用BigDecimal而不是double,您知道您仍然可以得到您真正考虑的值,而不仅仅是double可以保持的最接近的近似值

您可能还需要:

formatter.setMinimumFractionDigits(3);
formatter.setMaximumFractionDigits(3);

。。。以确保始终获得精确的5位数。例如,假设你希望1秒是1.000。

你已经有了一些很好的答案,但要解决你的实际问题:你不能格式化一个long并保留小数,因为long没有小数。相反,您需要计算一个具有小数的类型的值,并格式化该值。是的,但答案也解决了这个问题,因为最终结果是一个字符串。我的观点是,代码中的问题与字符串或格式无关;您正确地完成了这些部分。你的问题是原始数学。上面写的问题和你的评论表明你可能没有意识到这一点。如果这让你高兴,我会将它改为十进制…你已经有了一些好的答案,但要解决你的实际问题:你不能格式化一个long并保留小数,因为long没有小数。相反,您需要计算一个具有小数的类型的值,并格式化该值。是的,但答案也解决了这个问题,因为最终结果是一个字符串。我的观点是,代码中的问题与字符串或格式无关;您正确地完成了这些部分。你的问题是原始数学。上面写的问题和你的评论表明你可能没有意识到这一点。如果这让你高兴,我会把它改为十进制。。。