gpt4 book ai didi

wolfram-mathematica - 为什么 Round[2.75,0.1] 返回 2.800000000003?

转载 作者:行者123 更新时间:2023-12-03 17:44:06 26 4
gpt4 key购买 nike

Mathematica 8.0.1

任何人都可以解释这一结果背后的逻辑是什么

In[24]:= Round[10.75, .1]

Out[24]= 10.8

In[29]:= Round[2.75, .1]

Out[29]= 2.8000000000000003

我预计上面的第二个结果是 2.8?

编辑 1:

我试图做上述格式化目的只是为了使数字适合空间。我最终做了以下事情以获得我想要的结果:
In[41]:= NumberForm[2.75,2]
Out[41] 2.8

我希望 Mathematica 有 printf() 之类的格式化功能。我发现在 Mathematica 中格式化数字以获得精确的字段宽度,并且与使用 printf() 格式化规则相比,形式有点尴尬。

编辑2:
我在尝试格式化/回合的某个数字上尝试了 $MaxExtraPrecision=1000,但没有成功,这就是我发布此问题的原因。这里是
In[42]:= $MaxExtraPrecision=1000;
Round[2035.7520395261859,.1]

Out[43]= 2035.8000000000002


In[46]:= $MaxExtraPrecision=50;
Round[2.75,.1]

Out[47]= 2.8000000000000003

编辑 3:

我找到了这种方式,将数字格式化为一个小数点。使用Numberform,但首先需要通过计算小数点左边的位数,然后加1来找到要使用的n位精度。
In[56]:= x=2035.7520395261859;
NumberForm[x,IntegerLength[Round@x]+1]

Out[57]//NumberForm= 2035.8

编辑 4:

以上(编辑3)不适用于数字,例如
a=2.67301785 10^7

经过一些试验,我发现 Accounting Form 可以做我想做的事。 AccountingForm 摆脱了 NumberForm 没有的 10^n 形式:
In[76]:= x=2035.7520395261859;
AccountingForm[x,IntegerLength[Round@x]+1]

Out[77]//AccountingForm= 2035.8

In[78]:= x=2.67301785 10^7;
AccountingForm[x,IntegerLength[Round@x]+1]

Out[79]//AccountingForm= 26730178.5

对于格式化数值,我发现最好的语言是 Fortran,其次是 COBOL 以及那些使用或支持 printf() 标准格式的语言。使用 Mathematica,我确信可以进行这样的格式化,但对我来说这似乎太复杂了。我一直不明白为什么数学没有 Printf[]。

最佳答案

并非所有具有有限位数的十进制(基数 10)数字都可以用具有有限位数的二进制(基数 2)表示。例如。 0.1 不能用二进制表示,就像 1/3 ~= 0.33333... 不能用十进制表示。 Mathematica(和其他软件)在显示数字时将仅使用有限数量的十进制数字来隐藏此效果。但是,有时可能会出现足够的十进制数字显示不匹配的情况。

http://en.wikipedia.org/wiki/Floating_point#Representable_numbers.2C_conversion_and_rounding

编辑

此命令将显示当您使用 20 个二进制数字找到 0.1 的接近二进制表示时会发生什么,然后将其转换回十进制:

RealDigits[FromDigits[RealDigits[1/10, 2, 20], 2], 10]

关于wolfram-mathematica - 为什么 Round[2.75,0.1] 返回 2.800000000003?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6330855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com