Chuyển đổi số dấu phẩy động thành một độ chính xác nhất định, sau đó sao chép thành chuỗi


144

Tôi có một số điểm nổi, nói 135.12345678910. Tôi muốn nối giá trị đó thành một chuỗi, nhưng chỉ muốn 135.123456789. Với in ấn, tôi có thể dễ dàng làm điều này bằng cách làm một cái gì đó như:

print "%.9f" % numvar

với numvarsố gốc của tôi Có cách nào làm dễ hơn không?


2
% chính xác là như vậy -% không phải là một phần của chức năng in mà là của chuỗi - xem tài liệu Python
michael_s

Câu trả lời:


177

Với Python <3 (ví dụ 2.6 [xem bình luận] hoặc 2.7), có hai cách để làm như vậy.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

Nhưng lưu ý rằng đối với các phiên bản Python trên 3 (ví dụ: 3.2 hoặc 3.3), tùy chọn hai được ưu tiên .

Để biết thêm thông tin về tùy chọn hai, tôi đề nghị liên kết này về định dạng chuỗi từ tài liệu Python .

Và để biết thêm thông tin về tùy chọn một, liên kết này sẽ đủ và có thông tin về các cờ khác nhau .

Python 3.6 (được phát hành chính thức vào tháng 12 năm 2016), đã thêm fchuỗi ký tự, xem thêm thông tin ở đây , mở rộng str.formatphương thức (sử dụng dấu ngoặc nhọn để f"{numvar:.9f}"giải quyết vấn đề ban đầu), nghĩa là

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

giải quyết vấn đề Kiểm tra câu trả lời của @ Or-Duan để biết thêm thông tin, nhưng phương pháp này nhanh .


1
tùy chọn hai nên newer_method_string = "{:.9f}".format(numvar)- lưu ý các yêu cầu :để tách trường và định dạng. Tôi đã thử nghiệm điều này trên 2.7.5.
Caltor

1
Đối với tùy chọn python 2.6, hai nên là newer_method_string = "{0:.9f}".format(numvar)- lưu ý 0 bắt buộc cho tên trường cho phiên bản cũ hơn này.
ttq

56

Python 3.6

Để làm cho nó rõ ràng, bạn có thể sử dụng định dạng chuỗi f . Điều này có cú pháp gần như giống với formatphương thức, nhưng làm cho nó đẹp hơn một chút.

Thí dụ:

print(f'{numvar:.9f}')

Đọc thêm về chuỗi f mới:

Dưới đây là sơ đồ về thời gian thực hiện của các phương thức được thử nghiệm khác nhau (từ liên kết cuối cùng ở trên):

thời gian thực hiện


52

Sử dụng round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'

8

Nó không in định dạng, đó là thuộc tính của chuỗi, vì vậy bạn chỉ có thể sử dụng

newstring = "%.9f" % numvar

Hoặc sử dụng định dạng kiểu mới. valueString = "{: 9f}". định dạng (số)
Zaren

8

Trong trường hợp độ chính xác không được biết cho đến khi thời gian chạy, tùy chọn định dạng khác này hữu ích:

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'

3
Nếu bạn muốn sử dụng .format-method, lưu ý rằng điều này cũng có thể được thực hiện bằng cách lồng các đối số như vậy : '{:.{n}f}'.format(numvar,n=n).
nivk

2

Để đặt độ chính xác với 9 chữ số, hãy lấy:

print "%.9f" % numvar

Trả về độ chính xác với 2 chữ số:

print "%.2f" % numvar 

Trả về độ chính xác với 2 chữ số và giá trị chuyển đổi float:

numvar = 4.2345
print float("%.2f" % numvar) 

-2

Các strchức năng có một lỗi. Hãy thử như sau. Bạn sẽ thấy '0,196553' nhưng đầu ra bên phải là '0,196554'. Bởi vì strgiá trị mặc định của hàm là ROUND_HALF_UP.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")

2
Là gì với .vs ,? Và làm thế nào nó có liên quan đến câu hỏi của pauliwago?
Peter Mortensen
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.