为什么当精度 > 16 时 double.TryParse() return 为真
Why does double.TryParse() return true when the precision > 16
通过一个小测试,我使用以下代码:
double number;
var value = "123456789.123456789";
var style = NumberStyles.AllowDecimalPoint;
var culture = CultureInfo.InvariantCulture;
if (Double.TryParse(value, style, culture, out number))
Debug.WriteLine("Converted '{0}' to {1}.", value, number);
else
Debug.WriteLine("Unable to convert '{0}'.", value);
结果是
Converted '123456789.123456789' to 123456789.123457.
这是因为 value
太长,无法放入双人间。只允许使用 16 位数字。但是不应该 TryParse() return false
因为信息丢失了吗?
TryParse
returns 一个布尔值。值是否可以解析为双精度值。
它没有 return 确切的值,只有它是否可以被解析,作为 bool。
Msdn documentation 已经强调了这个事实
However, because of a loss of precision, the values may not be equal
并且它不构成转换失败,而是
if the s parameter is null
or String.Empty
, is not in a format
compliant with style, represents a number less than MinValue
or
greater than MaxValue
, or if style is not a valid combination of
NumberStyles
enumerated constants.
通过一个小测试,我使用以下代码:
double number;
var value = "123456789.123456789";
var style = NumberStyles.AllowDecimalPoint;
var culture = CultureInfo.InvariantCulture;
if (Double.TryParse(value, style, culture, out number))
Debug.WriteLine("Converted '{0}' to {1}.", value, number);
else
Debug.WriteLine("Unable to convert '{0}'.", value);
结果是
Converted '123456789.123456789' to 123456789.123457.
这是因为 value
太长,无法放入双人间。只允许使用 16 位数字。但是不应该 TryParse() return false
因为信息丢失了吗?
TryParse
returns 一个布尔值。值是否可以解析为双精度值。
它没有 return 确切的值,只有它是否可以被解析,作为 bool。
Msdn documentation 已经强调了这个事实
However, because of a loss of precision, the values may not be equal
并且它不构成转换失败,而是
if the s parameter is
null
orString.Empty
, is not in a format compliant with style, represents a number less thanMinValue
or greater thanMaxValue
, or if style is not a valid combination ofNumberStyles
enumerated constants.