假设用户输入的是十进制数,例如。 5.2155(有 4 位小数)。它可以自由存储(int,double)等。
有没有clever(或非常简单)找出数字有多少位小数的方法? (有点像如何通过屏蔽最后一位来发现数字是偶数还是奇数的问题)。
我知道的两种方法,不幸的是都不是很聪明,但这更多的是环境的限制而不是我的限制:-)
第一个是sprintf
数字到一个大缓冲区"%.50f"
格式化字符串,去掉尾随的零,然后计算小数点后的字符数。这将受到以下限制printf
家庭本身。或者您可以使用该字符串作为用户输入(而不是sprintf
ing 浮点值),从而完全避免浮点问题。
第二种方法是减去整数部分,然后迭代地乘以 10,然后再次减去整数部分,直到得到零。这受到浮点数计算机表示的限制 - 在每个阶段您都可能会遇到无法准确表示数字的问题(因此 .2155 实际上可能是 .215499999998)。类似于以下内容(未经测试,除了在我的脑海中,与 COMX-35 大致相同):
count = 0
num = abs(num)
num = num - int(num)
while num != 0:
num = num * 10
count = count + 1
num = num - int(num)
如果您知道您将得到的数字类型(例如,它们都是小数点后 0 到 4 位数字),您可以使用标准浮点“技巧”来正确执行此操作。例如,代替:
while num != 0:
use
while abs(num) >= 0.0000001:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)