我试图将浮点数舍入但具有一定条件。如果第二个小数点大于或等于9向上结束,则向下舍入。你能帮帮我吗?
//0.56 -> 0.5
//1.56 -> 1.5
//1.58 -> 1.5
//1.59 -> 1.6
//15.56 -> 15.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()可以解决这个问题