4

我知道这个问题重复了很多次,但请先看一下声明,然后标记它已经回答:)

为了将双精度值截断 2 位小数,我使用了两种在各处都提到的方法。它们在下面给出

    //this one
    DecimalFormat dtime = new DecimalFormat("#.##"); 
    return Double.valueOf(dtime.format(val));
    //or the one below
    BigDecimal bd = new BigDecimal(val);
    BigDecimal rounded = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
    return rounded.doubleValue();

问题在于,对于这两种方式,我大多在数据集中获得正确的舍入值。但奇怪的是,我同时得到了 2.00000000000005 或 19.97999999999 之类的值。

我没有得到的问题是为什么只有几个值没有四舍五入。有什么问题?

4

4 回答 4

2

为了将双精度值截断 2 位小数,我使用了两种在各处都提到的方法。

他们都错了,因为他们正在尝试不可能的事情。没有将双精度数截断到小数点后两位的事情,因为双精度数没有小数位。他们有二进制的地方。请在此处查看我的答案以获取证据。如果你想要小数位,你必须使用十进制基数,即BigDecimalDecimalFormat.

于 2013-04-05T00:03:32.190 回答
0

问题是,考虑到底层表示,浮点数本质上是近似的。因此,您将希望在近似值好的地方使用它们,并避免在近似值不好的地方(例如财务)使用它们。

调用rounded.doubleValue()仍然返回一个浮点数,因此它仍然受到表示限制的影响。

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

了解更多信息。

于 2013-04-04T18:32:04.770 回答
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();
    }
}

希望这可以帮助某人:)

于 2020-04-24T06:01:20.547 回答
-1

我对此很陌生,但是将所有东西都放在我面前,我是这样做的。现在请注意,这是数学上的截断,除了在每行之后的调试中,我不会转换为字符串。

它并不优雅,但似乎有效。这纯粹是一个解决问题的框架。

反正;

import java.util.Scanner;
public class TestConstructs 
 {
private static double w;
private static int w1;
private static double w2;
private static double w3;
private static int w4;
private static double w5;
private static double w6;

public static void main(String[] args) 
{
    // TODO Auto-generated method stub
    TestConstructs foo = new TestConstructs();
    foo.setWage(w);

}

public void setWage(double w)
{

    Scanner input = new Scanner(System.in);
    System.out.println("Enter Wage: "); //enter something longish like 30987.978654 or w/e
    w = input.nextDouble();
    w1 = (int)w;
    System.out.printf("%d w1\n",w1);
    w2 = w - w1;
    System.out.printf("%.3f w2\n",w2);
    w3 = w2*100;
    System.out.printf("%.3f w3\n",w3);
    w4 = (int)w3;
    System.out.printf("%d w4\n",w4);
    w5 = (double)w4;
    System.out.printf("%.3f w5\n",w5);
    w6 = 0 + w5/100;
    System.out.printf("%.3f w6\n",w6);
    w = w1 + w6;

    System.out.printf("%.3f final value\n",w); //.3 to show zero 
    input.close();
}

}

我最后得到的输入工资: 30987.978654 30987 w1 0.979 w2 97.865 w3 97 w4 97.000 w5 0.970 w6 30987.970 最终值

于 2013-09-29T20:22:51.590 回答