1

num2strOctave 中的函数存在问题。

string = num2str(8.395,3);
        

字符串返回“8.39”,而,

string = num2str(1.395,3);
        

返回“1.4”。

怎么可能?如何获得一致的小数位数?

4

2 回答 2

2

恰好中途时,IEEE 浮点数舍入到最接近的偶数。所以第一种情况向下舍入到 8,而在第二种情况下向上舍入到 2。

我认为这将始终显示 3 位数字(ref):

num2str(x,'%4.2f')
于 2020-07-05T01:33:25.540 回答
0

问题似乎是“为什么 8.395 被“向下”四舍五入,而 1.395 被“向上”四舍五入。这是一个错误吗?

是和不是。这是浮点运算的固有限制。实际上,这两个数字都不能精确地以浮点格式表示,因此使用它们的最接近的近似值。碰巧的是,8.395 的最接近的近似值只是“低于”该值,而 1.395 只是“高于”它。因此,八度将第一个“向下”四舍五入,而后者“向上”四舍五入。如果您为每个打印更多有效数字,您可以确认这一点:

sprintf("%.20f", 8.395)   % ans = 8.39499999999999957367
sprintf("%.20f", 1.395)   % ans = 1.39500000000000001776

因此,就“内存中的实际数字”而言,octave 是正确的。

如果您不关心“实际精度”而只想查看“视觉上期望的精度”,那么您可以创建一个简单的函数,在后台使用“round”(即最接近的整数)。例如

ndigits   = @(x)    10 ^ floor( log10( x ) );
sigdigits = @(x, s) round( x / ndigits(x) * 10^s ) / 10^s * ndigits(x);

sigdigits(8.395, 2)   % ans =  8.4000
sigdigits(1.395, 2)   % ans =  1.4000
于 2020-07-06T08:45:25.783 回答