我正在解决一个需要截断输出的问题,令我惊讶的是我无法找到在java中截断数字的方法。
输出必须是一个数字后跟6位小数。
我想要的是什么
double truncate(double number,int places)
和输出
truncate(14/3.0) = 4.666666
。
但我得到的是
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
long factor = (long) Math.pow(10, places);
value = value * factor;
long tmp = Math.round(value);
return (double) tmp / factor;
}
// rounds( 14/3.0 , 6 ) = 4.666667
String.format
我得到了
String.format("%.6f", 14/3.0) = 4.666667
我还尝试了一个我在stackoverflow上找到的解决方案,建议使用BigDecimal,这给了我同样的答案。
NumberFormat
似乎也以同样的方式运作
java.text.NumberFormat f = java.text.NumberFormat.getNumberInstance();
f.setMinimumFractionDigits(6);
System.out.println(f.format(14/3.0)); // 4.666667
是否有内置方法可以执行此操作,还是需要使用BigInteger之类的东西编写自己的方法? 有什么我做错了吗?
答案 0 :(得分:4)
这是因为你没有截断而是四舍五入:
long tmp = Math.round(value);
如果你使用强制转换它应该有效:
long tmp = (long) value;
因此,下面的代码会按预期输出4.666666
:
public static void main(String[] args) throws Exception {
System.out.println(truncate(14/3.0, 6));
}
public static double truncate(double value, int places) {
if (places < 0) {
throw new IllegalArgumentException();
}
long factor = (long) Math.pow(10, places);
value = value * factor;
long tmp = (long) value;
return (double) tmp / factor;
}
答案 1 :(得分:1)
双打没有小数位,因此你无法截断到任何特定数量的小数位。他们有二进制位置。如果您需要特定的十进制表示,请使用DecimalFormat
或BigDecimal.
答案 2 :(得分:0)
以下代码段帮助我限制了双精度值的小数位数(截断)。
public static Double truncate (double valueToTruncate, int numberOfDecimalPlaces) {
if (valueToTruncate > 0) {
return new BigDecimal(String.valueOf(valueToTruncate)).setScale(numberOfDecimalPlaces, BigDecimal.ROUND_FLOOR).doubleValue();
} else {
return new BigDecimal(String.valueOf(valueToTruncate)).setScale(numberOfDecimalPlaces, BigDecimal.ROUND_CEILING).doubleValue();
}
}
希望这对某人有帮助:)