- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
可以表示\转换为小数的最大 double 值是多少?
如何得出这个值 - 请举个例子。
更新
给定可以转换为小数的 double 的最大值,我希望能够将 double 往返转换为小数,然后再返回。但是,在@Jirka 的回答中给出诸如 (2^52)-1 之类的数字,这是行不通的。例如:
Test]
public void round_trip_double_to_decimal()
{
double maxDecimalAsDouble = (Math.Pow(2, 52) - 1);
decimal toDecimal = Convert.ToDecimal(maxDecimalAsDouble);
double toDouble = Convert.ToDouble(toDecimal);
//Fails.
Assert.That(toDouble, Is.EqualTo(maxDecimalAsDouble));
}
最佳答案
所有介于 -9,007,199,254,740,992 和 9,007,199,254,740,991 之间的整数都可以用 double 表示。(请继续阅读。)
上限导出为 2^53 - 1 .如果你原谅我的十六进制语法,它的内部表示类似于 (0x1.fffffffffffff * 2^52)。
在这个范围之外,许多整数如果是2的幂的倍数,仍然可以精确表示。
因此,可以准确表示的最高整数将是 9,007,199,254,740,991 * (2 ^ 1023)
,这甚至比 Decimal.MaxValue
还要高,但这是一个漂亮的毫无意义的事实,假设值不会改变,例如,当您在 double
算术中减去 1
时。
根据评论和进一步的研究,我添加了有关 C# 的 .NET 和 Mono 实现的信息,这些信息与您和我可能想要做出的大多数结论相关。
Math.Pow
似乎不能保证任何特定的准确性,而且它似乎比 double
可以表示的要少一两个。对于浮点函数,这并不奇怪。英特尔浮点硬件没有求幂指令,我预计计算涉及 logarithm and multiplication指令,其中中间结果会失去一些精度。如果需要积分精度,可以使用 BigInteger.Pow
。
但是,即使 (decimal)(double)9007199254740991M
也会导致往返违规。然而,这次是 known bug ,直接违反了 C# 规范的第 6.2.1 节。有趣的是,我什至在 Mono 2.8 中也看到了同样的错误。 (引用的来源表明,即使 低得多的值,此转换错误也可能发生。)
双字面量不太圆润,但仍然有一点:9007199254740991D 打印为 9007199254740990D。这是解析字符串字面值时内部乘以 10 的产物(在根据“小数点后的第一个零”,上下界收敛到相同的 double
值之前)。这再次违反了 C# 规范,这次是第 9.4.4.3 节。
与 C 不同,C# 没有十六进制浮点文字,因此我们无法通过任何其他语法避免乘以 10,除非通过 Decimal
或 BigInteger
,如果这些只提供准确的转换运算符。我没有测试过 BigInteger
。
以上内容几乎会让您想知道 C# 是否没有发明自己独特的降低精度的浮点格式。否,第 11.1.6 节引用 64 位 IEC 60559表示。所以以上确实是bug。
因此,总而言之,您应该能够将 9007199254740991M 精确地放入一个 double 中,但是要获得适当的值是一个相当大的挑战!
这个故事的寓意是“算术应该比数据和期望的结果稍微精确”的传统信念是错误的,因为this famous article演示(第 36 页),尽管是在不同的编程语言的上下文中。
除非必须,否则不要将整数存储在浮点变量中。
关于c# - Convert.ToDecimal(双 x) - System.OverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10783625/
我是 C# 新手,尝试将输入转换为十进制和 double 。当我输入整数时它工作正常,但当我输入十进制或 double 时它立即停止并给出“异常未处理”错误消息。 我的代码: Console.Writ
我正在尝试将字符串“10.00”转换为十进制,如下所示: decimal a = Convert.ToDecimal("10.00"); 但由于某些令人难以置信的原因,我得到了这个错误: Input
我正在尝试使用 Convert.ToDecimal 函数将 double 数转换为十进制数。 问题是.net 以某种方式选择根据原始双变量的大小省略十进制数字。 以下面的例子为例: d
我试图在我的应用程序中使用以下代码,它仅在法语操作系统中抛出异常。你能帮我解决这个问题吗? using System.Globalization; using System.Threading; ..
我希望有人可以帮助我理解为什么在 linq 中使用 Convert.ToDecimal 时会四舍五入小数点,而在外部使用时却不会 给定以下数据库: CREATE TABLE [dbo].[Widget
这个问题在这里已经有了答案: What's the main difference between int.Parse() and Convert.ToInt32 (13 个答案) 关闭 9 年前。
我目前正在学习依赖注入(inject),以使用 MVC 创建更易于维护的代码。我已经将模型和计算器服务注入(inject)到我的 Controller 中,而不是具有新的依赖项。 我的构造函数中有一些
我目前正在学习依赖注入(inject),以使用 MVC 创建更易于维护的代码。我已经将模型和计算器服务注入(inject)到我的 Controller 中,而不是具有新的依赖项。 我的构造函数中有一些
可以表示\转换为小数的最大 double 值是多少? 如何得出这个值 - 请举个例子。 更新 给定可以转换为小数的 double 的最大值,我希望能够将 double 往返转换为小数,然后再返回。但是
我正在将数据从 MySQL 数据库加载到 C# .NET 应用程序中。数据作为 DBType.Double 保存在数据库中,但为了在我的应用程序中使用,我使用 Convert.ToDecimal()
我正在读取一个包含值的 XML 文件。当我阅读它们时,它们是字符串。 因此,当我尝试将它们转换为 Double 或 Decimal 时,该点消失了。 decimal dec = Convert.ToD
Some_Variable 具有从数据库返回的值 295523.93。 [DataType: money (Transact-SQL数据类型,使用的数据库是SQL2005)] (decimal)Som
我有一个小数点后有 17 位的 double,即: double myDouble = 0.12345678901234567; 如果我像这样将其转换为 decimal: decimal myDeci
Convert.ToDecimal(string) 和 Decimal.Parse(string) 在 C# 中有什么区别? 在什么情况下你会使用一个而不是另一个? 它对性能有什么影响? 在两者之间进
这一行有格式问题: Decimal amount = Convert.ToDecimal(String.Format("{0:.##}", doubleAmount)); 如果 doubleAmou
我是一名优秀的程序员,十分优秀!