C/C++计算小数位数?

Mil*_*lan 18 c c++ decimal

假设用户输入的是十进制数,例如.5. 2155(有4位小数).它可以自由存储(int,double)等.

是否有任何聪明(或非常简单)的方法来找出这个数字有多少小数?(有点像问题是如何通过屏蔽最后一位来找到数字是偶数还是奇数).

pax*_*blo 21

我知道的两种方式,不幸的是不是很聪明,但这更像是对环境的限制而不是我:-)

第一个是sprintf带有"%.50f"格式字符串的大缓冲区的数字,去掉尾随的零,然后计算小数点后面的字符.这将受到printf家庭本身的限制.或者你可以使用字符串作为用户的输入(而不是sprintf浮点值),以避免浮点问题.

第二种是减去整数部分然后迭代乘以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)
Run Code Online (Sandbox Code Playgroud)

如果您知道您将获得的数字类型(例如,它们都是小数点后的0到4位数),您可以使用标准浮点"技巧"来正确执行.例如,而不是:

while num != 0:
Run Code Online (Sandbox Code Playgroud)

使用

while abs(num) >= 0.0000001:
Run Code Online (Sandbox Code Playgroud)

  • 不应该`而abs(num)<= 0.0000001:`是`而abs(num)> = 0.0000001:`? (3认同)
  • 我只会因为你对问题的回答有多彻底而将其归类为聪明人. (2认同)
  • @Guillaume,是的,恭喜你成为第一个在四年内收到错误的人.根据你的建议修正了. (2认同)

qua*_*dev 7

一旦将数字从用户表示(字符串,OCR-ed gif文件,等等)转换为浮点数,您就不必处理相同的数字.所以严格的,不是非常有用的答案是"不".

如果(情况A)您可以避免从字符串表示转换数字,问题变得更加容易,您只需要计算小数点后面的数字并减去尾随零的数量.

如果你不能这样做(情况B),那么你需要假设最大小数位数,将数字转换回字符串表示并使用round-to-even方法将其四舍五入到这个最大数字.例如,如果用户提供的1.1表示为1.09999999999999(假设),将其转换回字符串,则猜测"1.09999999999999".将这个数字四舍五入到比如四个小数点可以得到"1.1000".现在又回到了情况A.


Fer*_*cio 5

在我的头顶:

从小数部分开始:.2155

重复乘以 10 并丢弃数字的整数部分,直到得到零。步数将是小数位数。例如:

.2155 * 10 = 2.155
.155 * 10 = 1.55
.55 * 10 = 5.5
.5 * 10 = 5.0
Run Code Online (Sandbox Code Playgroud)

4 步 = 4 位十进制数字