【发布时间】:2020-04-03 21:39:15
【问题描述】:
我对汇编语言很陌生,所以请耐心等待......
我有一个浮点数,已四舍五入到最接近的 0.001,但仍显示为 +1.6670000E+000。我希望它显示为 1.667。
这是我对数字进行除法和四舍五入的代码:
fild num_a
fidiv num_b
fimul thousand
frndint
fidiv thousand
fst a_div_b
这是我显示浮动的代码:
mov eax, num_a
call WriteDec
mov edx, OFFSET divide
call WriteString
mov eax, num_b
call WriteDec
mov edx, OFFSET equals
call WriteString
fld a_div_b
call WriteFloat
call CrLf
我在网上查了很多关于如何四舍五入的答案,但它们仍然以扩展格式显示。我正在使用 irvine32 库。
【问题讨论】:
-
如果您无法访问允许指定格式的函数(例如
printf),则您自己将整数和小数部分分开,并根据数量打印它们之间的点你想要的数字。 -
有道理,谢谢!我知道如何获得整数部分,但我不知道如何获得小数部分,更不用说只打印 3 位数字了。
-
得到整数部分后,从原始数字中减去,然后乘以 1000 得到 3 位数。
-
您可以使用
x - (int)x隔离小数部分(使用截断到 0,而不是默认舍入到最近,例如使用 SSE3fisttp。否则您可能会得到一个负小数部分和一个整数部分 1 太高了。当然,使用 SSE2 更容易,您可以使用cvttsd2si而不是使用旧版 x87)。要获得前 3 位数字,您已经在使用诸如乘以 1000 之类的技巧来生成一些小数部分整数。 -
你也可以自己做数字转字符串,循环除以10,每次取余数。这是前导零最简单的方法。