将双值截断到小数点后6位。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将双值截断到小数点后6位。相关的知识,希望对你有一定的参考价值。
我在解决一个问题,需要将输出结果截断,令我惊讶的是,我一直没有找到在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之类的东西来编写我自己的方法?
答案
这是因为你不是截断而是四舍五入。
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;
另一答案
双数没有小数点,所以你不能把它们截断成任何特定的数字。它们有二进制位。如果你需要一个特定的小数点表示法,使用 DecimalFormat
或 BigDecimal.
另一答案
下面这段代码帮助我限制了双值的小数位数(截断)。
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();
希望能帮到大家:)
以上是关于将双值截断到小数点后6位。的主要内容,如果未能解决你的问题,请参考以下文章