首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Double转换为Numerics.BigInteger时的数字更改

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

Stack Overflow用户
提问于 2012-02-28 21:21:00
回答 2查看 427关注 0票数 0
代码语言:javascript
复制
using System.Numerics;

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

为什么BigInteger 的值不只是1千克(1,000,然后是1百亿个)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-28 21:31:20

BigInteger的实现使用了大量的位移位,因此当您将一个双比特转换为一个BigInteger时,双重表示有一个有限的位集(64位表示为一个双位),所以并不是所有的位都能准确地表示值。

而不是使用Math.Pow,您应该使用

代码语言:javascript
复制
var bigBase = BigInteger.Pow(1000, 99);

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

代码语言:javascript
复制
 var bigBase = (BigInteger)doubleNumber;

相当于:

代码语言:javascript
复制
var bigBase = new BigInteger(doubleNumber);
票数 1
EN

Stack Overflow用户

发布于 2012-02-28 21:26:20

System.Double的精度只有15位小数位,这意味着该值将接近实际值,但可能不精确。

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

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

如果您需要绝对的精度,您需要使用一个库/类型,它有,double没有。

对于特定的代码,您可能需要这样做:

代码语言:javascript
复制
BigInteger bigBase = BigInteger.Pow(1000, 99);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9489902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档