防止 MATLAB 舍入数字并设置小数精度

Posted

技术标签:

【中文标题】防止 MATLAB 舍入数字并设置小数精度【英文标题】:Preventing MATLAB from rounding numbers and set decimal precision 【发布时间】:2014-11-14 15:04:55 【问题描述】:

我正在尝试显示从串行接收到的值,但 Matlab 不接受十进制数字结果。 我想从设备接收 A=0.123,将值乘以 1000,然后通过串行发送到 matlab。

matlab 脚本接收到 123,但是当将该数字除以得到原始值时,matlab 显示 0。

consRollKpTemp = typecast([uint8(mess(typei + 1)), uint8(mess(typei + 2)),uint8(mess(typei + 3)), uint8(mess(typei + 4))], 'int32');
disp(consRollKpTemp);
consRollKp = consRollKpTemp/1000;
disp(consRollKp);

返回

consRollKpTemp:
         123    
consRollKp:
           0

我认为问题在于typecast(X,type) 函数

将 X 中的数值转换为 type 指定的数据类型。

我把它改成了:

consRollKpTemp = typecast([uint8(mess(typei + 1)), uint8(mess(typei + 2)),uint8(mess(typei + 3)), uint8(mess(typei + 4))], 'single');

但没有任何改变。我已经尝试过this question 和here 中的建议,但没有奏效。

【问题讨论】:

【参考方案1】:

问题是您使用int32 作为类型,即您只有整数并且0.23 正确舍入为0。尝试将变量consRollKp 转换为double,然后再除以1000:

consRollKp = double(consRollKpTemp) / 1000;

澄清:将typecastsingle 一起使用将不起作用。 Typecast 转换数据类型不改变底层数据。由于single 是一个浮点数,而uint8int32 是整数类型,所以它们之间的typecast 不会导致预期的结果。

尝试将typecast 转换为int32(或者可能是uint32),然后在第二步中使用dobule()single() 将此变量转换为浮点类型。最后,您应该能够除以 1000 并得到正确的结果。

【讨论】:

以上是关于防止 MATLAB 舍入数字并设置小数精度的主要内容,如果未能解决你的问题,请参考以下文章

将双精度数舍入到 x 有效数字

Matlab怎样设置数据的有效数字使得小数点后的位数更多?

将双精度数舍入到小数点后一位(去掉小数位)

matlab 设置小数点后位数

这种精度损失发生在哪里以及如何防止它?

如何在小数点后将 Dart 中的双精度数舍入到给定的精度?