【问题标题】:truncate decimals after 2 places for double without decimal Format在没有小数格式的双精度后截断小数点后 2 位
【发布时间】:2013-08-14 16:29:31
【问题描述】:

我正在尝试“截断”双精度以仅返回两位小数。

示例:
给定1375568.13124765 将返回 => 1375568.13

使用十进制格式太慢了。我在一个循环中多次调用它。为了加快我正在尝试的过程:

public static double castRoundTo2(double d)
{
  return (long) (d * 100 + 0.5) / 100.0;
}

这会返回类似1375568.13000015

有没有要截掉小数点后两位的内容?

这是用于数值计算的。

【问题讨论】:

  • 如果您对十进制数字感兴趣,最好先使用BigDecimal

标签: java performance double rounding


【解决方案1】:

您希望通过这样做实现什么目标?如果您只想很好地显示一个十进制数字,您可以这样做的一种方法是:

final double number = 45.212454664;
System.out.printf("%1.2f", number);

这将打印带有 2 位小数的数字。在这种情况下,输出为 45.21

编辑:如果您想要一种对数字进行四舍五入的通用方法,您可以执行以下操作:

    public static double round(final double number, final int precision){
    return Math.round(number * Math.pow(10, precision)) / Math.pow(10, precision);
}

【讨论】:

  • 这个和System.out.printf("%.2f", number);一样
【解决方案2】:

有没有要删掉小数点后两位?

这就是它的作用。

我会检查你的测试

public static void main(String[] args) {
    System.out.println(castRoundTo2(1375568.13000015));
    System.out.println(castRoundTo2(1375568.13124765));

    System.out.println(round2(-1375568.13000015));
    System.out.println(round2(-1375568.13124765));
}

public static double castRoundTo2(double d) {
    return (long) (d * 100 + 0.5) / 100.0;
}

public static double round2(double d) {
    return roundToFactor(d, 100);
}

public static double roundToFactor(double d, double f) {
    return Math.round(d * f) / f;
}

打印

1375568.13
1375568.13
-1375568.13
-1375568.13

注意:castRoundTo2 舍入为正无穷大。 Math.round,从零开始四舍五入。

如果你想要一个简单的方法,你可以这样做

【讨论】:

  • 在回顾我的代码后非常有帮助,我在测试用例中发现了问题。感谢您创建示例。
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多