首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将双精度值截断为6位小数

将双精度值截断为6位小数
EN

Stack Overflow用户
提问于 2012-12-07 01:41:10
回答 3查看 9K关注 0票数 1

我正在解决一个需要截断输出的问题,令我惊讶的是,我还没有找到一种在java中截断数字的方法。

输出必须是数字后跟6位小数。

我想要的是double truncate(double number,int places),输出是truncate(14/3.0) = 4.666666

但我得到的是

代码语言:javascript
运行
复制
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,我得到了

代码语言:javascript
运行
复制
String.format("%.6f", 14/3.0) = 4.666667

我还尝试了我在stackoverflow上找到的一个解决方案,它建议使用BigDecimal,并给出了完全相同的答案。

NumberFormat似乎也以同样的方式工作

代码语言:javascript
运行
复制
java.text.NumberFormat f = java.text.NumberFormat.getNumberInstance();
f.setMinimumFractionDigits(6);
System.out.println(f.format(14/3.0)); // 4.666667

有没有内置的方法可以做到这一点,或者我是否需要使用BigInteger之类的东西来编写自己的方法?我是不是做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-07 01:42:27

这是因为您不是在截断而是舍入:

代码语言:javascript
运行
复制
long tmp = Math.round(value);

如果您使用强制转换,那么它应该可以工作:

代码语言:javascript
运行
复制
long tmp = (long) value;

因此,下面的代码会像您预期的那样输出4.666666

代码语言:javascript
运行
复制
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;
}
票数 5
EN

Stack Overflow用户

发布于 2012-12-07 08:50:25

Double没有小数位,因此你不能截断到任何特定的数字。它们有二进制位。如果需要特定的小数表示法,请使用DecimalFormatBigDecimal.

票数 1
EN

Stack Overflow用户

发布于 2020-04-24 14:04:55

下面的代码帮助我限制了双精度值的小数位数(截断)。

代码语言:javascript
运行
复制
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();
}

}

希望这对某些人有帮助:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13749336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档