在尝试使用以下参数解析变量浮动时 float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out fValue),
value=6666.77777 四舍五入为 6666.778。
谁能帮忙,我不希望我的价值四舍五入。
在尝试使用以下参数解析变量浮动时 float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out fValue),
value=6666.77777 四舍五入为 6666.778。
谁能帮忙,我不希望我的价值四舍五入。
float
只有大约 6 位有效数字。请注意,小数点前的数字也很重要。double
在这方面具有更高的精度(大约 16):
PS> [float]::Parse('6666,77777')
6666.778
PS> [double]::Parse('6666,77777')
6666.77777
但正如其他人指出的那样,这只是一个近似值,因为它不能以基数 2 精确表示。如果您需要小数精度(例如货币值),请使用 a decimal
。对于大多数其他事情,二进制浮点(即float
和double
)应该没问题。
这是因为值 666.77777 不能以浮点数使用的二进制形式表示 - 实际数字包含的二进制数比浮点数的空间多。结果数字是最接近的近似值。
当浮点运算(或转换为浮点格式)的确切结果需要比有效数字中的数字更多的数字时,使用舍入。IEEE 754 要求正确舍入:也就是说,舍入结果就像使用无限精确的算术来计算值然后进行舍入(尽管在实现中只需要三个额外的位来确保这一点)。有几种不同的舍入方案(或舍入模式)。从历史上看,截断是典型的方法。自 IEEE 754 引入以来,更常用的是默认方法(四舍五入,与偶数相等,有时称为银行家四舍五入法)。
double
如果您需要更高的精度,或者需要更多的精度,您应该考虑使用decimal
,尽管它们在某些时候也会遭受精度损失。
为什么不使用Double.TryParse或Decimal.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);
decimal
如果您需要更高的精度,您应该使用。