我有一個非常煩人的任務要做,并堅持下去。所以:我需要撰寫一個函式,它在小數點后回傳一個浮點數的值。例如:引數為:5.456->,回傳值應為:456。
我不能使用字串(當然這很容易)。
你有什么建議嗎?
uj5u.com熱心網友回復:
它需要一些步驟來使用像floator之類的原語double。如果您被允許使用BigDecimal,這將只是一行代碼。
給定double d = 5.456;
- 首先,將浮點數之前的部分剪掉。
- 這樣做
int full = (int)d;將是 5 - 從中減去全部:
d-full現在將只是該點之后的部分,所以.456
- 這樣做
- 現在使用回圈將值乘以 10,直到“點之后”部分為 0。
這里的特殊之處在于,當您使用 double 時,您會遇到浮點精度問題。這意味著這d將具有0.4560000000000004介于兩者之間的價值。為了解決這個問題,讓我們引入一個 epsilon。
完整的代碼如下所示:
private static final double EPS = 1e-5;
public static void main(String[] args) {
double d = 5.456;
System.out.println(afterDot(d));
}
private static int afterDot(double d) {
d = getDecimals(d);
while(getDecimals(d) > EPS){ //decimals will likely never be 0 because of precision, so compare with a really small EPS instead of 0
d *= 10;
}
//cast the result to an int to cut off the double precision issues
return (int)d;
}
private static double getDecimals(double d) {
int full = (int) d;
d = d-full;
return d;
}
這列印456。我很確定這可以以某種方式進行優化,但它是一個有效的初稿。
uj5u.com熱心網友回復:
您想要的是余數,乘以 10,直到余數為 0。BigDecimal用于防止出現如下所示的舍入問題:
final BigDecimal input = new BigDecimal("5.456");
BigDecimal x = input.remainder(BigDecimal.ONE);
while (x.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO) > 0) {
x = x.multiply(new BigDecimal(10));
}
System.out.println(x.longValue());
uj5u.com熱心網友回復:
這里有兩種不針對浮點例外進行調整的方法。
double s = 5.456;
System.out.println(s%1);
或者
System.out.println(s-(int)s);
都列印
0.4560000000000004
或者使用BigDecimal并調整比例并減去整數值。
System.out.println(BigDecimal.valueOf(s)
.setScale(3)
.subtract(BigDecimal.valueOf((int)s)));
印刷
.456
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414442.html
標籤:
