为什么当精度 > 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.