【问题标题】:Convert Double from String从字符串转换双精度
【发布时间】:2015-06-22 14:17:35
【问题描述】:

将字符串转换为浮点数时,转换器会产生错误的结果。

?Global.System.Convert.ToDouble("635705821821928755").ToString("0")
"635705821821929000"

?Global.System.Convert.ToSingle("635705821821928755").ToString("0")
"635705800000000000"

我正在 ASP.Net 网页上使用 VB.Net Visual Studio 2012,Framework 4。

有没有办法将大数从字符串转换为浮点数?

【问题讨论】:

  • 在 double 和 single 值中,source 对结果是完全错误的。 635705821821928755 是输入,输出是 635705821821929000。
  • DoubleSingle 与其他数字类型一样 - 它们只能以任何精度保持特定值。 Decimal 足够大吗?

标签: asp.net vb.net visual-studio-2012 converter


【解决方案1】:

结果没有错,只是精度低于您的预期。浮点数在设计上具有有限的精度,您根本无法期望得到比其极限更精确的结果。

您可以使用Decimal 来获得更高的精度。在这种情况下,您使用的数字就足够了:

?Convert.ToDecimal("635705821821928755").ToString("0")
"635705821821928755"

double 的精度为 15-16 位,Decimal 的精度为 28-29 位。

注意:严格来说,Decimal 不是浮点数,而是固定精度数。它是一个带十进制的整数,因此例如数字 12.345 存储为 12345 * 10-3

【讨论】:

  • 在那种情况下,?Double.MaxValue.ToString("0") 的最大值不会真的把每个单数都取到1.7976931348623157E+308?它会四舍五入吗?
  • @Nasenbaer:是的,Decimal 的精度也低于范围,就像double。只有整数的精度和范围是相同的。
【解决方案2】:

您应该使用 System.Numerics 中的 BigInteger 结构。

【讨论】:

  • 看起来它适用于 Framework 4.5 但我只有 4.0?无论如何,你能举个例子吗?我发现:msdn.microsoft.com/en-us/library/…
  • 我有带有 Framework 4.0 的 Visual Studio 2010。您必须添加引用 System.Numerics,然后才能将 BigInteger 用作独立类型。
  • BigInteger BIG = BigInteger.Parse("635705821821928755");
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 2012-12-02
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多