点后面只有两位数的双精度数

时间:2017-11-19 18:09:42

标签: java eclipse algorithm math

我正在研究java上的一个项目,并且无法获得一个非常重要的工作方法

我尝试了多个解决方案,其中很多来自stackoverflow中的类似问题,这些答案似乎都不适用于案例

我需要的是一个简单的方法,它将得到一个双倍,无论double的值是多少,只要在点后面有两个以上的数字它将返回相同的数字后只有前两位数字点

例如,即使输入为“-3456.679985432333” 输出将是“-3456.67”,而不像其他解决方案给我的“-3456.68

最近似乎有效的解决方案是

public static double round (double d) {
    d = (double) (Math.floor(d * 100)) / (100);
    return d;
}

但是当输入为“-0.3355555555555551”输出为“-0.34”而不是“-0.33”时,它确实失败了 我不知道为什么它会失败,而我只有几个小时的时间才能完成这个项目。

编辑:我发现的修复很简单,效果很好

  public static double round (double d){ 
      if (d>0) return (double) (Math.floor(d*100))/100;
      else 
      {
      return (double) (Math.ceil(d*100))/100;
      }
}

无论如何,感谢所有向我解释我的方法有什么问题的人,我会确保尝试所有的解决方案

4 个答案:

答案 0 :(得分:1)

说明

Java正在运行正确。相反,floor会返回小于(或等于)给定值的第一个整数zero转。

对于您的输入-0.335...,您首先乘以100并接收-33.5...。如果您现在使用floor,则您正确接收-34,因为其否定数字,-34是第一个低于 {{1}的整数}}

解决方案

如果您想要剥离(删除)小数点后的所有内容,则需要使用33.5...作为负数。或者使用始终向零舍入的方法,即ceil强制转换:

int

(另见round towards zero in java

更好的替代方案

然而,有专门的,更好的方法来实现你想要的。考虑使用public static double round (double d) { d = (double) ((int) (d * 100)) / (100); return d; } documentation):

DecimalFormat

或者任何其他变体,只需搜索它,有很多这样的问题:How to round a number to n decimal places in Java

答案 1 :(得分:1)

这样的东西就足够了:

DecimalFormat formatter = new DecimalFormat("##.##"); //
formatter.setRoundingMode(RoundingMode.DOWN); // Towards zero
String result = formatter.format(input);

返回:

public static double truncate(double input) {
       DecimalFormat decimalFormat = new DecimalFormat("##.##");
       decimalFormat.setRoundingMode(RoundingMode.DOWN);
       String formatResult = decimalFormat.format(input);
       return Double.parseDouble(formatResult);
}

-3456.67

分别为所提供的两个例子。

答案 2 :(得分:0)

public static double CustomRound(double number, int digits)
{
    if (digits < 0)
        throw new IllegalArgumentException();

    long f = (long)Math.pow(10, digits);

    number = number * f;

    long rnd = Math.round(number);

    return (double)(rnd / f);
}

另一种方法:

public static double round(double number, int digits)
{
    if (digits < 0)
        throw new IllegalArgumentException();

    BigDecimal bd = new BigDecimal(value);
    bd = bd.setScale(digits, RoundingMode.HALF_UP);

    return bd.doubleValue();
}

答案 3 :(得分:0)

你能做到这一点,你需要做的就是: 数字* 10或(100), 然后转换为int, 然后回到双倍和/ 10(或100)。 10 =数字后的1个数字, 100 = 2(如果我没记错的话)。