Chuyển đổi float thành chuỗi mà không làm tròn nó


88

Tôi đang tạo một chương trình, vì những lý do không cần giải thích, yêu cầu chuyển đổi float thành một chuỗi để được đếm với len (). Tuy nhiên, str (float (x)) dẫn đến x được làm tròn khi được chuyển đổi thành một chuỗi, điều này sẽ loại bỏ toàn bộ. Có ai biết về một sửa chữa cho nó? Đây là mã đang được sử dụng nếu bạn muốn biết:

len(str(float(x)/3))

2
nếu x ban đầu là str, tại sao ép kiểu?
Vinko Vrsalovic

1
-1: Không có ví dụ nào về đầu ra bắt buộc cho các giá trị khác nhau của x. Nếu không có ví dụ, chúng ta chỉ có thể đoán vấn đề là gì.
S.Lott

Câu trả lời:


129

Một số dạng làm tròn thường không thể tránh khỏi khi xử lý các số dấu phẩy động. Điều này là do các số mà bạn có thể biểu thị chính xác trong cơ số 10 không phải lúc nào cũng được biểu thị chính xác trong cơ số 2 (mà máy tính của bạn sử dụng).

Ví dụ:

>>> .1
0.10000000000000001

Trong trường hợp này, bạn thấy .1 được chuyển đổi thành một chuỗi bằng cách sử dụng repr:

>>> repr(.1)
'0.10000000000000001'

Tôi tin rằng python đã cắt bỏ một vài chữ số cuối cùng khi bạn sử dụng str () để giải quyết vấn đề này, nhưng đó là một giải pháp thay thế một phần không thay thế cho việc hiểu những gì đang xảy ra.

>>> str(.1)
'0.1'

Tôi không chắc chính xác vấn đề "làm tròn" đang gây ra cho bạn. Có lẽ bạn sẽ làm tốt hơn với định dạng chuỗi như một cách để kiểm soát chính xác hơn đầu ra của mình?

ví dụ

>>> '%.5f' % .1
'0.10000'
>>> '%.5f' % .12345678
'0.12346'

Tài liệu tại đây .


12
len(repr(float(x)/3))

Tuy nhiên, tôi phải nói rằng điều này không đáng tin cậy như bạn nghĩ.

Số nổi được nhập / hiển thị dưới dạng số thập phân, nhưng máy tính của bạn (trên thực tế, thư viện C chuẩn của bạn) lưu trữ chúng dưới dạng nhị phân. Bạn nhận được một số tác dụng phụ từ quá trình chuyển đổi này:

>>> print len(repr(0.1))
19
>>> print repr(0.1)
0.10000000000000001

Lời giải thích về lý do tại sao điều này xảy ra là trong chương này của hướng dẫn python.

Một giải pháp sẽ là sử dụng một loại theo dõi cụ thể các số thập phân, như python decimal.Decimal:

>>> print len(str(decimal.Decimal('0.1')))
3

Bài tốt về cách làm việc với kết quả phao từ bộ phận: stackoverflow.com/questions/2958684/python-division
Trutane

3

Các câu trả lời khác đã chỉ ra rằng việc biểu diễn các số nổi là một vấn đề hóc búa, ít nhất phải nói rằng.

Vì bạn không cung cấp đủ ngữ cảnh trong câu hỏi của mình, tôi không thể biết liệu mô-đun thập phân có thể hữu ích cho nhu cầu của bạn hay không:

http://docs.python.org/library/decimal.html

Trong số những thứ khác, bạn có thể chỉ định rõ ràng độ chính xác mà bạn muốn lấy (từ tài liệu):

>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')

Một ví dụ đơn giản từ lời nhắc của tôi (python 2.6):

>>> import decimal
>>> a = decimal.Decimal('10.000000001')
>>> a
Decimal('10.000000001')
>>> print a
10.000000001
>>> b = decimal.Decimal('10.00000000000000000000000000900000002')
>>> print b
10.00000000000000000000000000900000002
>>> print str(b)
10.00000000000000000000000000900000002
>>> len(str(b/decimal.Decimal('3.0')))
29

Có lẽ điều này có thể giúp đỡ? thập phân nằm trong python stdlib kể từ 2.4, với các bổ sung trong python 2.6.

Hy vọng điều này sẽ giúp, Francesco


0

Tôi biết điều này là quá muộn nhưng đối với những người đến đây lần đầu tiên, tôi muốn đăng một giải pháp. Tôi có một giá trị float indexvà một chuỗi imgfilevà tôi đã gặp vấn đề tương tự như bạn. Đây là cách tôi khắc phục sự cố

index = 1.0
imgfile = 'data/2.jpg'
out = '%.1f,%s' % (index,imgfile)
print out

Đầu ra là

1.0,data/2.jpg

Bạn có thể sửa đổi ví dụ định dạng này tùy theo sự thuận tiện của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.