是否有任何在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); }