将Double转换为Numerics.BigInteger时的数字更改

时间:2012-02-28 21:21:00

标签: .net double biginteger

using System.Numerics;

double doubleNumber = Math.Pow(1000, 99); // = 1.0E+297
BigInteger bigBase = (BigInteger)bigNumber; // = 1000000000000000017652801462756379714374878780719864776839443139119744823869255243069012222883470359078822072829219411228534934402712624705615450492327979456500795456339201761949451160807447294527656222743617592048849967890105831362861792425329827928397252374398383022243308510390698430058459037696

为什么BigInteger值不仅仅是1千兆(1000后跟一万亿0)?

2 个答案:

答案 0 :(得分:4)

System.Double只有15个十进制数字的精度,这意味着该值将关闭到实际值,但可能不准确。

这一切都与浮点值的编码方式有关,以便占用固定数量的内存。

这是让1.0最终成为0.999999999999999999etc的问题。

如果您需要绝对精度,则需要使用具有该{/ 1}}的库/类型。

对于您的特定代码,您可能希望这样做:

double

答案 1 :(得分:1)

BigInteger的实现使用大量的位移,所以当你将double转换为BigInteger时,double表示有一组有限的位(对于double来说是64位),所以不是所有的位都是准确地代表价值。

您应该使用

而不是使用Math.Pow
var bigBase = BigInteger.Pow(1000, 99);

此外,显式地将数字类型转换为BigInteger与使用BigInteger构造函数相同:

 var bigBase = (BigInteger)doubleNumber;

相当于:

var bigBase = new BigInteger(doubleNumber);