Sau khi nhìn qua câu trả lời cho một số câu hỏi tương tự, điều này có vẻ là giải pháp tốt nhất đối với tôi:
def floatToString(inputValue):
return ('%.15f' % inputValue).rstrip('0').rstrip('.')
lập luận của tôi:
%g
không loại bỏ ký pháp khoa học.
>>> '%g' % 0.000035
'3.5e-05'
15 chữ số thập phân dường như tránh hành vi lạ và có nhiều chính xác cho nhu cầu của tôi.
>>> ('%.15f' % 1.35).rstrip('0').rstrip('.')
'1.35'
>>> ('%.16f' % 1.35).rstrip('0').rstrip('.')
'1.3500000000000001'
Tôi có thể đã sử dụng format(inputValue, '.15f').
thay vì '%.15f' % inputValue
, nhưng đó là một chút chậm hơn (~ 30%).
Tôi có thể đã sử dụng Decimal(inputValue).normalize()
, nhưng điều này cũng có một số vấn đề. Đối với một, nó là A LOT chậm hơn (~ 11x). Tôi cũng thấy rằng mặc dù nó có độ chính xác khá lớn, nó vẫn bị mất chính xác khi sử dụng normalize()
.
>>> Decimal('0.21000000000000000000000000006').normalize()
Decimal('0.2100000000000000000000000001')
>>> Decimal('0.21000000000000000000000000006')
Decimal('0.21000000000000000000000000006')
Quan trọng nhất, tôi sẽ vẫn được chuyển đổi để Decimal
từ một float
có thể làm cho bạn kết thúc với một cái gì đó khác hơn số bạn đặt vào đó. Tôi nghĩ rằng Decimal
hoạt động tốt nhất khi số học nằm trong Decimal
và Decimal
được khởi tạo bằng một chuỗi.
>>> Decimal(1.35)
Decimal('1.350000000000000088817841970012523233890533447265625')
>>> Decimal('1.35')
Decimal('1.35')
tôi chắc chắn rằng vấn đề chính xác của Decimal.normalize()
có thể được điều chỉnh để những gì cần thiết sử dụng cài đặt bối cảnh, nhưng xem xét tốc độ đã chậm và không cần độ chính xác vô lý và thực tế là tôi vẫn muốn được chuyển đổi từ một nổi và mất chính xác anyway, tôi không nghĩ rằng nó là giá trị theo đuổi.
Tôi không quan tâm đến kết quả "-0" có thể do -0.0 là số dấu phẩy động hợp lệ và có thể hiếm khi xảy ra, nhưng vì bạn đã đề cập bạn muốn giữ kết quả chuỗi ngắn càng tốt, bạn luôn có thể sử dụng thêm một điều kiện với chi phí tăng thêm rất ít.
def floatToString(inputValue):
result = ('%.15f' % inputValue).rstrip('0').rstrip('.')
return '0' if result == '-0' else result
Đó dụ không thực hiện bất kỳ ý nghĩa gì cả. '3.14 == 3.140' - Chúng là số * dấu chấm động * cùng. Đối với vấn đề đó, 3.140000 là cùng một số dấu phẩy động. Số không không tồn tại ở nơi đầu tiên. –
@ S.Lott - Tôi nghĩ rằng vấn đề là IN số float mà không có dấu 0, không phải là sự tương đương thực tế của hai số. – pokstad
@pokstad: Trong trường hợp đó, không có "thừa" không. '% 0.2f' và'% 0.3f' là hai định dạng cần thiết để tạo ra các số cuối cùng bên trái. Sử dụng '% 0.2f' để tạo hai số cuối cùng bên phải. –