【问题标题】:How can I remove last digit off a decimal number in Java?如何在Java中删除十进制数的最后一位?
【发布时间】:2016-10-14 01:18:37
【问题描述】:

例如,当我有 3.333 并且执行该代码时,我需要数字为 3.33。

这是我应该做的代码,但没有:

String number = Double.toString(first);
number = number.substring(0, string.length() - 1);
first = Double.parseDouble(number);

我尝试通过将数字转换为字符串、切断最后一个字符并再次将其保存为双精度来做到这一点。但它不起作用。它不是切断 1 位,而是切断 2,例如上面它将返回 3.3。

这种方法可靠吗?如果可以,我能做些什么来解决它?

此外,这种方法是否有可能使程序崩溃(只有十进制数字通过该代码)并且会损失精度?

【问题讨论】:

  • 我建议使用 BigDecimal 而不是 double
  • 为什么?我认为没有理由
  • String 有一个格式化程序,可以将字符串格式化为您想要的精度。您必须将其打印在字符串中才能获得所需的精度。但不要转换为字符串,然后再转换为双精度。这是API for String.Format
  • @Frecklefoot 我现在会调查它。而且我想没有办法通过这种方式使程序崩溃?

标签: java


【解决方案1】:

使用String.format:

String.format("%.2f", 3.333);

或使用BigDecimal:

new BigDecimal(3.333).setScale(2, RoundingMode.DOWN)

setScale 设置您需要多少个小数点。 你可以稍后在上面的 BigDecimal 上做一个toString() 并打印出来。

【讨论】:

  • BigDecimal 方法对我来说是一个非常好的选择。要转换为 double 只需使用 BigDecimal.doubleValue() 方法
【解决方案2】:

这个呢:

double value = 3.333;
// Multiply it by 100, convert the result into an integer to trim 
// remaining decimals then divide it by 100d to get the result as double
double result = (int)(value * 100) / 100d;
System.out.println(result);

输出:

3.33

【讨论】:

  • 不需要比String.format()更复杂。
  • 好的,我收回我之前的反对意见。你的回答很有创意也很正确。
【解决方案3】:

如果您想要始终保持相同的小数位数,据我所知,最好的解决方案是这个:

DecimalFormat df = new DecimalFormat("#.00");

String formatedNumber = df.format(number);

【讨论】:

    【解决方案4】:

    试试这个:

    double d = 3.333;
    String str = String.format("%1.2f", d);
    d = Double.valueOf(str);
    System.out.println(d);
    

    输出:

    3.33

    【讨论】:

    • 或更简化的System.out.println(Double.valueOf(String.format("%1.2f", 3.333)));
    • @scarecrow- 哦,是的,谢谢,希望他了解这些步骤。
    【解决方案5】:

    您要完成的主要问题是Doubles 始终是 64 位信息。它们应该尽可能准确,同时代表抽象/非理性值,而不是打算根据这种准确性进行操纵。对于精确值,它们不能被信任(输入值 1 在保存为双精度值或类似的东西时可能最终为 0.99999999998)。如果您想要一个确切的数字,请考虑以某种容量使用ints(即您可以制作一个包含分子和分母的分数对象)。您应该减少双精度的唯一一次是用于打印,而这只能像上面那样使用String 表示来真正完成。

    【讨论】:

    • 他不是在问四舍五入,只是把最后一位数字删掉。 String.format() 可以处理此任务,并为此类问题准确地提供
    • 他们的字符串舍入技术很好……这根本不是字符串问题,而是值问题,因为对浮点数存在根本性的误解。他们使用Double.parseDouble() 并希望将数字四舍五入到小数点后一位。为什么你会在不阅读问题的情况下对我的答案投反对票?这个问题没有正确的答案,这只是一个误导性的问题和一个学习的机会。
    • 我会牢记您的“没有一个正确答案”的回答。但我确实认为你让它变得比它需要的更复杂。但是,我想您的解决方案可能有效,但我不会那样做。
    • 这很公平,这可能很复杂,但如果这是真的(我很确定它是),那么这可能是 OP 听到的最好的事情,特别是如果他们在相当基本的水平,似乎是这样。
    • 为未来打下更好的基础。
    【解决方案6】:

    这段代码是可靠的。

    Double number = 3.333 ;
    String  mano   = Double.toString(number);
    String akmuo = mano.substring(0, mano.length() - 1);
    number = Double.parseDouble(akmuo);
    System.out.println(number);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多