1

在尝试使用以下参数解析变量浮动时 float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out fValue),

value=6666.77777 四舍五入为 6666.778。

谁能帮忙,我不希望我的价值四舍五入。

4

4 回答 4

3

float只有大约 6 位有效数字。请注意,小数点前的数字也很重要。double在这方面具有更高的精度(大约 16):

PS> [float]::Parse('6666,77777')
6666.778
PS> [double]::Parse('6666,77777')
6666.77777

但正如其他人指出的那样,这只是一个近似值,因为它不能以基数 2 精确表示。如果您需要小数精度(例如货币值),请使用 a decimal。对于大多数其他事情,二进制浮点(即floatdouble)应该没问题。

于 2012-10-23T06:04:22.753 回答
1

这是因为值 666.77777 不能以浮点数使用的二进制形式表示 - 实际数字包含的二进制数比浮点数的空间多。结果数字是最接近的近似值。

当浮点运算(或转换为浮点格式)的确切结果需要比有效数字中的数字更多的数字时,使用舍入。IEEE 754 要求正确舍入:也就是说,舍入结果就像使用无限精确的算术来计算值然后进行舍入(尽管在实现中只需要三个额外的位来确保这一点)。有几种不同的舍入方案(或舍入模式)。从历史上看,截断是典型的方法。自 IEEE 754 引入以来,更常用的是默认方法(四舍五入,与偶数相等,有时称为银行家四舍五入法)。

double如果您需要更高的精度,或者需要更多的精度,您应该考虑使用decimal,尽管它们在某些时候也会遭受精度损失。

于 2012-10-23T06:03:47.900 回答
1

为什么不使用Double.TryParseDecimal.TryParse来支持更高的精度:

float : 约 ±1.5 x 10-45 至 ±3.4 x 1038,7 位有效数字

双倍:约 ±5.0 x 10-324 至 ±1.7 x 10308,有效数字为 15 或 16

十进制:约 ±1.0 x 10-28 至 ±7.9 x 1028,有效数字为 28 或 29

试试这段代码片段:

double fValue;
double.TryParse("6666.77777", NumberStyles.Double, CultureInfo.InvariantCulture, out fValue);

或者

decimal fValue;
decimal.TryParse("6666.77777", NumberStyles.Decimal, CultureInfo.InvariantCulture, out fValue);
于 2012-10-23T06:08:54.850 回答
0

decimal如果您需要更高的精度,您应该使用。

于 2012-10-23T06:03:26.050 回答