是否有任何在java中截断double的函数?

是否有Java库函数可用于将数字截断为任意数量的小数位? 例如。

SomeLibrary.truncate(1.575, 2) = 1.57 

谢谢

尝试使用BigDecimal的 setScale:

 public static double round(double d, int decimalPlace) { BigDecimal bd = new BigDecimal(d); bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP); return bd.doubleValue(); } 

令人难以置信的是,没有人提出这个问题,Java API现在已经有了很多年的DecimalFormat用于这个目的。

对于大多数数字,除非使用具有保证精度的十进制类,否则您将无法获得xxx.yyyy的精确表示,例如BigDecimal 。

公共数学中有一个。 查看http://commons.apache.org/math/apidocs/org/apache/commons/math/util/MathUtils.html

 public static double round(double x, int scale) 

它是使用BigDecimal实现的,并且重载以允许指定舍入方法,因此您可以使用它来截断,如下所示:

 org.apache.commons.math.util.MathUtils.round(1.575, 2, java.math.BigDecimal.ROUND_DOWN); 

更新:

在上一个版本(Math3)中,此方法位于Precision类中。 org.apache.commons.math3.util.Precision.round(double x, int scale, int roundingMethod)

使用这个简单的function

 double truncateDouble(double number, int numDigits) { double result = number; String arg = "" + number; int idx = arg.indexOf('.'); if (idx!=-1) { if (arg.length() > idx+numDigits) { arg = arg.substring(0,idx+numDigits+1); result = Double.parseDouble(arg); } } return result ; } 

我只想添加到ubuntudroid的解决方案。 我尝试了它,它不会向下舍入,所以我不得不添加

 df.setRoundingMode(RoundingMode.FLOOR); 

它的工作原理。

这是一个简短的实现,比使用BigDecimal或Math.pow快很多倍

 private static long TENS[] = new long[19]; static { TENS[0] = 1; for (int i = 1; i < TENS.length; i++) TENS[i] = 10 * TENS[i - 1]; } public static double round(double v, int precision) { assert precision >= 0 && precision < TENS.length; double unscaled = v * TENS[precision]; if(unscaled < Long.MIN_VALUE || unscaled > Long.MAX_VALUE) return v; long unscaledLong = (long) (unscaled + (v < 0 ? -0.5 : 0.5)); return (double) unscaledLong / TENS[precision]; } 

删除品味的断言。 ;)

只需删除小数部分即可

public double trunk(double value){ return value - value % 1; }

实际上,这种事情很容易写:

 public static double truncate(double value, int places) { double multiplier = Math.pow(10, places); return Math.floor(multiplier * value) / multiplier; } 

请注意,它是Math.floor,因为Math.round不会截断。

哦,这会返回一个double,因为这就是Math类中大多数函数返回的内容(如Math.pow和Math.floor)。

警告:双打很难准确。 首先应考虑BigDecimal解决方案之一。

要100%可靠地执行它,您必须将参数作为字符串传递,而不是作为浮点数传递。 当以字符串forms给出时,代码很容易编写。 原因是这样的

 double x = 1.1; 

并不意味着x实际上将评估为1.1,而不是最接近的可精确表示的数字。

创造了一种方法来做到这一点。

 public double roundDouble(double d, int places) { return Math.round(d * Math.pow(10, (double) places)) / Math.pow(10, (double)places); }