Hai cách tôi biết, không phải rất thông minh không may nhưng điều này là hơn một hạn chế của môi trường chứ không phải là tôi :-)
Đầu tiên là số sprintf
số đến một bộ đệm lớn có chuỗi định dạng "%.50f"
, loại bỏ các số 0 sau đó đếm các ký tự sau dấu thập phân. Điều này sẽ bị giới hạn bởi chính gia đình printf
. Hoặc bạn có thể sử dụng chuỗi như đầu vào của người dùng (thay vì sprintf
nhập giá trị dấu chấm động), để tránh hoàn toàn các vấn đề về dấu phẩy động.
Thứ hai là trừ phần số nguyên rồi lặp lại nhân với 10 và trừ đi phần số nguyên cho đến khi bạn nhận được 0. Điều này bị giới hạn bởi các giới hạn của biểu diễn máy tính của các số dấu phẩy động - ở mỗi giai đoạn bạn có thể gặp vấn đề về một số không thể được biểu diễn chính xác (vì vậy, 2155 thực sự có thể là .215499999998). Giống như sau (chưa được kiểm tra, ngoại trừ trong đầu tôi, đó là khoảng ngang bằng với một COMx-35):
count = 0
num = abs(num)
num = num - int(num)
while num != 0:
num = num * 10
count = count + 1
num = num - int(num)
Nếu bạn biết loại số bạn sẽ nhận được (ví dụ như, họ sẽ tất cả được 0 đến 4 chữ số sau dấu thập phân), bạn có thể sử dụng các điểm "thủ thuật" nổi để làm điều đó đúng cách. Ví dụ, thay vì:
while num != 0:
sử dụng
while abs(num) >= 0.0000001:
Bạn có thể làm rõ "số lượng số thập phân có" không? Bạn có nghĩa là, có bao nhiêu chữ số thập phân trong phần phân số của số? – Doug
Vâng, giả định của bạn là chính xác. – Milan