舍入Double到2十进制而不更改数据类型

时间:2017-08-30 06:46:06

标签: java

double value1 = 1000
double value2 = 2563.59
System.out.println("value1 ="+String.format("%.2f",value1));
System.out.println("value2 ="String.format("%.2f",value2));

Output 
value1 = 1000.00
value2 = 2563.60

这会返回1000.002563.60,但输出类型会更改为字符串。

我希望1000.002563.60作为输出而不更改数据类型。

任何人都可以帮助我吗?

dtatype必须是双倍的

5 个答案:

答案 0 :(得分:0)

如果您不希望将其更改为字符串,请不要使用String.format(..)

请参阅Decimal Format

// 2 places of decimal
DecimalFormat formatter = new DecimalFormat( "#.00" );

System.out.println(formatter.format(1.23));    // 1.23
System.out.println(formatter.format(1));       // 1.00
System.out.println(formatter.format(1.234));   // 1.23

答案 1 :(得分:0)

请注意,double类型存储值,而不是字符串。在某些情况下,将其四舍五入到小数点后两位也不会改变。例如,值1。如果您在String.format上执行1,它将变为1.00。但是,11.00是相同的值,因此将1转换为2位小数会再次使其成为1double认为11.00是相同的值(我的意思是,他们真的,它的格式不同)。

另请注意,double值不准确。它可能看起来好像是1.23,但实际上它可能类似于1.2300000000000001

要将双精度校正为2 d.p.,您所要做的就是将格式化的字符串转换回双精度值:

String str = String.format("%.2f",value1));
double result = Double.parseDouble(str);

答案 2 :(得分:0)

为什么你首先使用string.format?

DecimalFormat f = new DecimalFormat("##.00");
System.out.println(f.format(value1));

你需要导入java.text.DecimalFormat;为此

答案 3 :(得分:0)

使用BigDecimal.setScale()并使用舍入模式上限

    double value1 = 1000;
    double value2 = 2563.59;

    System.out.println("Before");
    System.out.println("value1 = " + value1);
    System.out.println("value2 = " + value2);

    value1 = BigDecimal.valueOf(value1).setScale(1, RoundingMode.CEILING).doubleValue();
    value2 = BigDecimal.valueOf(value2).setScale(1, RoundingMode.CEILING).doubleValue();

    System.out.println("After");
    System.out.println("value1 = " + value1);
    System.out.println("value2 = " + value2);

答案 4 :(得分:0)

在任何使用有限精度的二进制浮点数 - 这是Java和大多数编程语言的默认值 - 概念"小数位数"只适用于显示。内部二进制表示没有"小数位的概念"因为数据不是小数。

因此,小数位数仅适用于数据的显示方式,与显示的数据类型无关。

当出现关于舍入十进制数的问题时,通常是因为程序员还没有完全理解浮点数学的工作原理。