Wolfram mathematica 为什么第[2.75,0.1]轮返回280亿m3?
Mathematica 8.0.1 任何人都可以解释这一结果背后的逻辑Wolfram mathematica 为什么第[2.75,0.1]轮返回280亿m3?,wolfram-mathematica,Wolfram Mathematica,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 我希望Math
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
经过一些尝试,我找到了一个会计表格来做我想做的事情。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[]。数字是以2为基数存储的,而不是以10为基数(十进制)。不可能用基数2表示
2.8
,因此它使用最接近的值:2.800000000000003
并非所有位数有限的十进制(以10为基数)数都可以用位数有限的二进制(以2为基数)表示。例如,0.1不能用二进制表示,就像1/3~=0.33333。。。不能用十进制表示。Mathematica(和其他软件)在显示数字时仅使用有限的小数位数来隐藏此效果。但是,有时可能会出现显示足够多的十进制数字,从而使不匹配变得可见的情况
编辑
此命令将显示当您使用20个二进制数字找到0.1的二进制表示形式,然后将其转换回十进制时发生的情况:
RealDigits[FromDigits[RealDigits[1/10, 2, 20], 2], 10]
Number/AccountingForm
可以在第二个参数中获取一个列表,其中第二项是小数点后要显示的位数:
In[61]:= x=2035.7520395261859;
In[62]:= AccountingForm[x,{Infinity,3}]
Out[62]//AccountingForm= 2035.752
也许这很有用。中最接近的值实际上只是
2.8
。考虑:a=N[FromDigits[RealDigits[2.8,2,2,30];b=N[FromDigits[RealDigits[Round[2.75,1],2],2],30];{14/5-a,b-14/5}
给出了{1.7763568394003*10^-16,2.6645352591004*10^-16}
@AlexeyPopkov事实上,MMA的机器编号最接近2.8的值是2.79999999999999822364316059974953532283310546875(其次是2.80000000000000266352591003756970167160068775)。精确数字2.8(即Wolfram中的28/10
)是一个循环的二进制分数2+和[12*16^-n,{n,1,∞}]代码>。