用指数记数法赋值和计算

Posted

技术标签:

【中文标题】用指数记数法赋值和计算【英文标题】:Assign and calculate by exponential notation 【发布时间】:2011-11-10 16:16:54 【问题描述】:

你有没有观察到这种现象:

如果我尝试在 Visual Studio 2010 C# .Net 的 ImmediateWindow 中计算以下计算,我会得到这个奇怪的解决方案。

1E-9 * 100 = 0.00000010000000000000001
1E-9 * 1E+2 = 0.00000010000000000000001

即使我这样计算:

double val = 1E-9;
0.000000001
val = val * 100;
0.00000010000000000000001

如果我在 Windows calc 中计算相同的计算,我会得到预期的结果:

1E-9 * 100 = 0,0000001

如果有人对这种行为有所了解,我会很高兴获得信息。

【问题讨论】:

也许 windows 计算器不使用双精度数?为什么你认为它们应该具有相同的精度? 您是否对0.00000010000000000000001 的行为感兴趣,这是尝试在二进制计算机中存储十进制数字的结果(之前已经回答过很多次),或者Windows Calc 得到它的事实别人弄错的时候对吗? 【参考方案1】:

您是否使用指数表示法并不重要,您只是遇到了浮点精度。如果您想要更好的准确性,请使用小数,例如:

decimal val = 1E-9;
0.000000001
val = val * 100;
0.0000001

见What Every Computer Scientist Should Know About Floating-Point Arithmetic

【讨论】:

以上是关于用指数记数法赋值和计算的主要内容,如果未能解决你的问题,请参考以下文章

王道计算机组成原理笔记9 进位记数法 进制转换 BCD码 字符

如何利用wincc脚本对变量进行计算

将科学记数法格式的字符串字符转换为标准记数法

如何给一个CTime类型的对象赋值

《Java编程思想》读书笔记之第3章-操作符

C语言中赋值语句的语法是怎样的