防止 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;
澄清:将typecast
与single
一起使用将不起作用。 Typecast 转换数据类型不改变底层数据。由于single
是一个浮点数,而uint8
和int32
是整数类型,所以它们之间的typecast
不会导致预期的结果。
尝试将typecast
转换为int32
(或者可能是uint32
),然后在第二步中使用dobule()
或single()
将此变量转换为浮点类型。最后,您应该能够除以 1000 并得到正确的结果。
【讨论】:
以上是关于防止 MATLAB 舍入数字并设置小数精度的主要内容,如果未能解决你的问题,请参考以下文章