按特定小数值的舍入数

时间:2017-12-28 18:31:19

标签: java math

我试图将浮点数舍入但具有一定条件。如果第二个小数点大于或等于9向上结束,则向下舍入。你能帮帮我吗?

        //0.56 -> 0.5
        //1.56 -> 1.5
        //1.58 -> 1.5
        //1.59 -> 1.6
        //15.56 -> 15.5

5 个答案:

答案 0 :(得分:3)

要在0.09向上舍入,向下舍入0.089999999...,您需要添加0.01并截断为1位小数位。

可以使用Math.floor()方法截断正浮点值,如下所示:

Math.floor(value * 10 + 0.1) / 10

<强>更新

由于0.59之类的数字实际上是0.58999999999999996,因此当意图进行整理时,它会向下舍入。

绕过&#34; broken floating point math&#34;的一种方法是使用BigDecimal

BigDecimal.valueOf(value).add(new BigDecimal("0.01")).setScale(1, RoundingMode.DOWN)

如果你这么做,那么应该将new BigDecimal("0.01")值创建为静态最终常量。

注意:与第一个解决方案一样,这仅适用于正数。

答案 1 :(得分:2)

这很好用。

float n = 1.7912f;
n = n*100.0f;
long a = (int) n;
if (a % 10 >=9) {
    a=a+1;
} 
n =  (float) a / 100.0f;
System.out.println(n);

答案 2 :(得分:1)

其中一个不同的解决方案是检查最后一位数字。

float number = number*100;
if (number % 10 >=9) {
    number = number + (10-(number % 10));
} else {
    number = number - (number % 10);
}
number = number / 100;

答案 3 :(得分:0)

这是我自制的解决方案。创建float的字符串值的子字符串,该字符串在小数点后面开始两个字符,并在小数点后面结束三个字符(看起来像这样:inputString=".56" subString="6")。获取该子字符串的整数值并将其与9进行比较。如果它大于或等于,则再添加十分之一。否则从百分之一的地方修剪浮动并继续前进。它不是很漂亮,但它有效:

public static void main(String[] args) {
    long current = System.currentTimeMillis();
    System.out.println(doWierdOperation(0.56F) + " - " + (System.currentTimeMillis()-current) + "ms.");
    current = System.currentTimeMillis();
    System.out.println(doWierdOperation(1.56F) + " - " + (System.currentTimeMillis()-current) + "ms.");
    current = System.currentTimeMillis();
    System.out.println(doWierdOperation(1.58F) + " - " + (System.currentTimeMillis()-current) + "ms.");
    current = System.currentTimeMillis();
    System.out.println(doWierdOperation(1.59F) + " - " + (System.currentTimeMillis()-current) + "ms.");
    current = System.currentTimeMillis();
    System.out.println(doWierdOperation(15.56F) + " - " + (System.currentTimeMillis()-current) + "ms.");
}


public static float doWierdOperation(float val) {
    String sValue = String.valueOf(val);
    int dec =  sValue.indexOf(".");
    if (sValue.charAt(dec + 2) == '9') {
        // Increment at tenths palce
        val += 0.1F;
    }
    // Trim from hundredth place
    return Float.valueOf(String.valueOf(val).substring(0, dec + 2));
}

首先运行:

0.5 - 3ms.
1.5 - 0ms.
1.5 - 0ms.
1.6 - 0ms.
15.5 - 0ms.

第二轮:

0.5 - 3ms.
1.5 - 0ms.
1.5 - 0ms.
1.6 - 0ms.
15.5 - 0ms.

第三次运行:

0.5 - 2ms.
1.5 - 0ms.
1.5 - 0ms.
1.6 - 0ms.
15.5 - 0ms.

答案 4 :(得分:-3)

Math.round()可以解决这个问题