num2strOctave 中的函数存在问题。
string = num2str(8.395,3);
字符串返回“8.39”,而,
string = num2str(1.395,3);
返回“1.4”。
怎么可能?如何获得一致的小数位数?
问题似乎是“为什么 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