Sau khi xem qua câu trả lời cho một số câu hỏi tương tự, đây dường như là giải pháp tốt nhất cho tôi:
def floatToString(inputValue):
return ('%.15f' % inputValue).rstrip('0').rstrip('.')
Lý luận của tôi:
%g
không thoát khỏi ký hiệu khoa học.
>>> '%g' % 0.000035
'3.5e-05'
15 vị trí 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 chậm hơn một chút (~ 30%).
Tôi có thể đã sử dụng Decimal(inputValue).normalize()
, nhưng điều này cũng có một vài vấn đề. Đối với một, nó chậm hơn rất nhiều (~ 11x). Tôi cũng thấy rằng mặc dù nó có độ chính xác khá lớn, nhưng 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 vẫn sẽ chuyển đổi Decimal
từ một float
thứ có thể khiến bạn kết thúc bằng thứ gì đó không phải là số bạn đặt trong đó. Tôi nghĩ rằng Decimal
hoạt động tốt nhất khi số học ở lại Decimal
và Decimal
được khởi tạo với 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 Decimal.normalize()
có thể được điều chỉnh theo những gì cần thiết khi sử dụng cài đặt ngữ cảnh, nhưng xem xét tốc độ đã chậm và không cần độ chính xác lố bịch và thực tế là tôi vẫn chuyển đổi từ phao và mất độ chính xác, tôi đã không Tôi không nghĩ rằng nó đáng để theo đuổi.
Tôi không quan tâm đến kết quả "-0" có thể vì -0.0 là số dấu phẩy động hợp lệ và dù sao nó cũng có thể là một trường hợp hiếm gặp, nhưng vì bạn đã đề cập đến việc bạn muốn giữ kết quả chuỗi càng ngắn càng tốt, bạn luôn luôn có thể sử dụng một điều kiện bổ sung với rất ít chi phí tốc độ thêm.
def floatToString(inputValue):
result = ('%.15f' % inputValue).rstrip('0').rstrip('.')
return '0' if result == '-0' else result
3.14 == 3.140
- Chúng là cùng một số dấu phẩy độ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.