仅在需要时显示双精度数的小数

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));

【讨论】:

以上是关于仅在需要时显示双精度数的小数的主要内容,如果未能解决你的问题,请参考以下文章

C#将数字四舍五入为双精度数的任意数字[重复]

JAVA 中除法后小数精度问题

如何处理 vb.net 中双精度数的舍入错误?

仅在应用程序需要时显示锁屏小部件以控制应用程序

PHP 数字:小数点仅在需要时可见

提取双精度数的分数系数