以2位精度存储双精度

时间:2012-02-22 21:39:57

标签: c# c#-4.0

如何将双精度转换为2位精度?

例如:

    double x = 1.00d;           
    Console.WriteLine(Math.Round(x,2,MidpointRounding.AwayFromZero));
//Should output 1.00 for me, but it outputs just 1.

我正在寻找的是将1.00存储在一个双变量中,当打印到控制台时会打印1.00。

谢谢, -Mike

4 个答案:

答案 0 :(得分:14)

“x”存储数字 - 它不注意精度。

要以特定的精度输出数字为字符串,请使用format specifier,即:

Console.WriteLine(x.ToString("F2"));

答案 1 :(得分:5)

double是IEEE-754双精度浮点数。它总是具有正好53位的精度。它没有可以精确表示在“小数位”的精度 - 正如短语暗示的那样,“小数位”仅测量相对于基数为10的数字系统的精度。

如果您想要的只是更改显示的值的精度,那么您可以使用其中一个ToString()重载来执行此操作,如此处的其他答案所指出的那样。

还要记住,double连续实际值的近似值;也就是说,没有隐含离散量化的值(尽管这些值实际上被量化为53位)。如果您要表示的是离散值,则存在隐式量化(例如,如果您正在使用货币值,其中0.1和0.099999999999999之间存在显着差异),那么您应该使用基于整数语义的数据类型 - 使用缩放整数的定点表示或类似.NET decimal类型的数据类型。

答案 2 :(得分:3)

这不是存储的问题,而是格式化的问题。

此代码生成1.00

double x = 1.00d;
Console.WriteLine("{0:0.00}", Math.Round(x, 2, MidpointRounding.AwayFromZero));

答案 3 :(得分:1)

decimal数据类型具有可变精度的概念。双数据类型没有。它的精度始终为53位。

double的默认字符串表示形式略微舍入以最小化奇怪的值,如0.999999999999,然后删除任何尾随零。正如其他答案所述,您可以使用类型ToString重载之一来更改该行为。