仅在需要时显示双精度数的小数
Posted
技术标签:
【中文标题】仅在需要时显示双精度数的小数【英文标题】:Show decimal of a double only when needed 【发布时间】:2012-08-06 10:23:44 【问题描述】:我遇到了双(小数)的问题。
当 double = 1.234567 然后我使用String.format("%.3f", myString);
所以结果是 1.234
但是当我的双倍是 10 结果将是 10,000 我希望这是 10
他们是说他只需要在“有用”时显示小数吗?
我看到了一些关于这个的帖子,但那是 php 或 c#,找不到关于这个的 android/java 的东西(也许我看起来不太好)。
希望你们能帮我解决这个问题。
编辑,现在我使用这样的东西:myString.replace(",000", "");
但我认为他们是一个更“友好”的代码。
【问题讨论】:
【参考方案1】:带有# 参数的DecimalFormat 是要走的路:
public static void main(String[] args)
double d1 = 1.234567;
double d2 = 2;
NumberFormat nf = new DecimalFormat("##.###");
System.out.println(nf.format(d1));
System.out.println(nf.format(d2));
会导致
1.235
2
【讨论】:
此代码未考虑用户的区域设置。例如,使用荷兰语语言环境,十进制数应该用逗号书写:“1,235”而不是“1.235”。 是的。这 ”。”我给 DecimalFormat 作为参数并不意味着“写一个点”,它的意思是“写小数点分隔符或货币小数点分隔符”见docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html。我刚刚通过在函数开头将默认语言环境设置为法语进行了测试,并且正如预期的那样,输出中的点被有效地替换为逗号。 你是对的,对不起,我的错。此代码根据用户的区域设置正确格式化小数分隔符。这段代码也适用于我:NumberFormat.getNumberInstance().format(power))。它只是不允许设置精度。【参考方案2】:不要使用双打。你可能会失去一些精度。这是一个通用函数。
public static double round(double unrounded, int precision, int roundingMode)
BigDecimal bd = new BigDecimal(unrounded);
BigDecimal rounded = bd.setScale(precision, roundingMode);
return rounded.doubleValue();
你可以调用它
round(yourNumber, 3, BigDecimal.ROUND_HALF_UP);
“精度”是您想要的小数位数。
Copy from Here.
【讨论】:
您好,谢谢您的回复。我试过了,我现在得到(示例)从 10,000 到 10.0 ,所以还是一位小数,知道如何“解决”这个问题吗?或者我做错了什么。 相同,但发现了一些有趣的东西:当我得到这个数字 123,405 并将“精度”设置为 2 时,它会得到 123,4(这很好)但如果你得到一个“整数” , 它总是在它后面设置,0。所以 10 -> 10,0。 jolivier 的回答对我有用,但感谢您帮助我! (赞成票) 这感觉有点过头了。 base10 与 base2 或 base3 相比没有什么特别之处。一条“从不使用双打”的毯子感觉就像是不必要的缓慢和尴尬程序的秘诀。如果您正在测量金钱,那么双倍显然是不合适的,如果您正在测量墙壁的长度,它很好(据我所知,BigDecimal 会遇到“三分之一米”长的墙壁的问题就像双倍一样)【参考方案3】:试试看
double amount = 1.234567 ;
NumberFormat formatter = new DecimalFormat("##.###");
System.out.println("The Decimal Value is:"+formatter.format(amount));
【讨论】:
以上是关于仅在需要时显示双精度数的小数的主要内容,如果未能解决你的问题,请参考以下文章