Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 为什么第[2.75,0.1]轮返回280亿m3?_Wolfram Mathematica - Fatal编程技术网

Wolfram mathematica 为什么第[2.75,0.1]轮返回280亿m3?

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

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
经过一些尝试,我找到了一个会计表格来做我想做的事情。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,∞}]