【问题标题】:How to always keep 2 decimal places in Java如何在 Java 中始终保留 2 位小数
【发布时间】:2023-03-05 05:15:02
【问题描述】:

我想在 Java 中将任何双精度数四舍五入为小数点后 2 位的字符串。 我曾尝试使用 DecimalFormat,但它没有给出预期的结果。 任何帮助将不胜感激。

例如:I/P:3402100.5323

我想把它转换成:

O/P:34.02

我尝试过使用 DecimalFormat("##,##,##0.00", new DecimalFormatSymbols(Locale.US)) 但这会导致 34,02,100.53 而我希望它输出 34.02

PS:如果 I/P 为 34.02,我希望它在应用格式后仍保持不变

【问题讨论】:

  • 您能添加更多示例输入和输出吗?您提供的单个示例没有多大意义。
  • @Kirit 前 4 位数字转换为带 2 位小数的 2 位双精度数。
  • 不是重复的,而是critical for you to understand

标签: java


【解决方案1】:

我认为您正在寻找的是 java.math.BigDecimal 类 (https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html)。

在你的情况下,它看起来像这样:

BigDecimal rounded = BigDecimal.valueOf(yourDoubleValueHere).setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(rounded); // 34.02

它可以通过基本上以十进制形式存储数字来替换双精度数(尽管语法更复杂),这意味着您可以对其进行运算并保持两位小数并避免舍入问题。

编辑:想了想,这可能有点矫枉过正,因为你只想得到一个带有舍入值的字符串,但我会把它留在那里以防万一。

【讨论】:

  • 这似乎是在黑暗中的刺。
  • @rzwitserloot Nah,“始终保留 2 个小数位”意味着使用十进制表示。 OP 似乎提出的请求定义不明确,甚至不一致。
  • 从“保留 2 个小数位”到“肯定 OP 对 BD 有潜在需求”是逻辑上的疯狂跳跃。也许他们正在做货币,应该将美分存储在多头而不是美元中。也许不需要完美的准确性,只需要四舍五入。
  • @rzwitserloot 事实是,我读 OP 的问题有点太快了,没有注意到它只是为了获得正确的字符串,并立即认为这是最好的依靠。
【解决方案2】:
【解决方案3】:

您可以为此使用 format 试试这个它对我来说 100% 有效。

String.format("%.2f", value)

有用的链接

https://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax

【讨论】:

    【解决方案4】:

    将一个数字变成完全不同的数字自然不是十进制格式的工作。

    要从代表 3402100.5323 的数字到字符串“34.02”,首先您必须获得一个更接近“34.02”的数字。也就是说,先除以 10000.0。

    从那里开始,String.format("%.2f") 似乎是一条简单的路径:它将任何双精度都呈现为字符串,但在小数分隔符后永远不会使用超过 2 位数字。如果您希望 3400000.123 变成“34.00”而不是“34”,您可以让 String.format("%.02f") 强制为零。

    public String renderWhateverThatIs(double in) {
        return String.format("%.02f", in / 100000.0);
    }
    
    renderWhateverThatIs(3402100.5323);
    > 34,02
    

    请注意,机器区域设置将决定您是否看到点或逗号作为分隔符。您可以通过将语言环境显式传递给 format 来强制解决问题。

    【讨论】:

      【解决方案5】:

      在我看来,这可以通过两个步骤来实现:

      1. 将数字转换为您的自定义 四舍五入。 (3402100.5323 至 34.021005323)。将输入除以 10 的幂,使其四舍五入为 2 位。

      2. 然后可以漂亮地打印转换后的数字以截断 2 位小数后的值(34.021005323 到 34.02)

        public static void main(String[] args) {
          double input = 3402100.5323;
        
          double output = input / getDivisor(input);
          System.out.printf("%.2f%n", output);
        }
        
        private static double getDivisor(double input) {
          int length = String.valueOf((long) input).length();
          return Math.pow(10, length - 2) ;
        }
        

      输出:34.02

      【讨论】:

      • 这是一个很好的解决方案。它在我的答案中使用了一些数学而不是繁重的字符串操作。将 double 转换为 long 并检查其字符串长度非常聪明。
      【解决方案6】:

      我不相信您可以在一个步骤中实现您想要的(前 4 位数字转换为 2 位带 2 位小数的双精度数)。我将分解我将尝试的方法的步骤:

      将输入双精度转换为字符串

      double d = 3402100.5323;
      String dStr1 = String.valueOf(d); // dStr1 will be “3402100.5323”
      

      接下来,从字符串中删除小数

      String dStr2 = dStr1.replace(‘.’,’’); // dStr2 will be “34021005323”
      

      然后,获取您感兴趣的前 4 位数字

      String dStr3 = dStr2.substring(0,4); // dStr3 will be “3402”
      

      最后,插入一个小数点

      String result = dStr3.substring(0,2) + “.” + dStr3.substring(2); // result will be “34.02”
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-26
        • 2022-12-07
        • 1970-01-01
        • 2023-03-22
        • 2016-06-01
        • 2011-01-01
        • 1970-01-01
        相关资源
        最近更新 更多