2011-12-21 35 views
16

Tự giải thích, tôi muốn nhận được 1324343032,324truncate tới 3 thập phân trong python

Như bạn thấy bên dưới, sau đây không làm việc:

>>1324343032.324325235 * 1000/1000 
1324343032.3243253 
>>int(1324343032.324325235 * 1000)/1000.0 
1324343032.3239999 
>>round(int(1324343032.324325235 * 1000)/1000.0,3) 
1324343032.3239999 
>>str(1324343032.3239999) 
'1324343032.32' 
+4

Không có giá trị như vậy trong tập đó được đại diện bởi số dấu chấm động. –

+2

Trong trường hợp nhận xét của Karl không đủ rõ ràng: Có * không có số * như 1324343032.324 trong dấu phẩy động nhị phân. Nếu bạn chuyển sang phiên bản cao hơn của Python (2.7 hoặc 3.1 trở lên), thông dịch viên sẽ * hiển thị * 1324343032.324 cho bạn. Nhưng trong thực tế, số bạn đang tính toán không phải là 1324343032.324 cũng như 1324343032.3239999 bất kể phiên bản Python. Cách duy nhất để có được * chính xác * 1324343032.324 là sử dụng mô-đun 'thập phân 'hoặc một số thư viện toán học tùy ý khác, chẳng hạn như' gmpy'. –

+0

Câu trả lời được chấp nhận bên dưới là chính xác, nếu bạn muốn làm tròn (lên) đến một số chữ số thập phân nhất định. Tuy nhiên, câu hỏi đặt ra là gì, và những gì tôi muốn biết, là làm thế nào để cắt ngắn đến một số vị trí thập phân cụ thể. Đối với tôi, ''% .3f'% (1324343032.3243)' và ''% .3f'% (1324343032.3245)' cho kết quả khác nhau. (Tôi đang sử dụng Python 2.7.8). – nullstellensatz

Trả lời

31

'%.3f'%(1324343032.324325235)

Sử dụng thêm một float() xung quanh nếu bạn muốn giữ nó như một phao.

+0

Tôi không muốn in nó ... Tôi muốn lưu trữ nó – SuperString

+2

Điều này về cơ bản là câu trả lời đúng, chỉ cần sử dụng 'val = '% .3f'% (1324343032.324325235)' thay vì 'in'. –

+0

Đã chỉnh sửa. Bạn có thể in nó, lưu nó, bất cứ điều gì. –

7

Làm thế nào về điều này:

In [1]: '%.3f' % round(1324343032.324325235 * 1000/1000,3) 
Out[1]: '1324343032.324' 

trùng lặp có thể xảy ra của round() in Python doesn't seem to be rounding properly

[EDIT]

Với ý kiến ​​bổ sung Tôi tin rằng bạn sẽ muốn làm:

In : Decimal('%.3f' % (1324343032.324325235 * 1000/1000)) 
Out: Decimal('1324343032.324') 

Các floa điểm chính xác ting sẽ không thể là những gì bạn muốn:

In : 3.324 
Out: 3.3239999999999998 

(tất cả các ví dụ là với Python 2.6.5)

3

liên kết Almo của giải thích lý do tại sao điều này xảy ra. Để giải quyết vấn đề, hãy sử dụng decimal library.

6

Sử dụng mô-đun thập phân. Nhưng nếu bạn phải sử dụng phao nổi và vẫn bằng cách nào đó ép buộc chúng vào một số điểm thập phân nhất định chuyển đổi thành chuỗi, một hậu tố cung cấp phương thức làm việc (khá vụng về, tôi sợ).

>>> q = 1324343032.324325235 * 1000/1000 
>>> a = "%.3f" % q 
>>> a 
'1324343032.324' 
>>> b = float(a) 
>>> b 
1324343032.324 

Vì vậy:

float("%3.f" % q) 
+1

Thật tốt khi bạn đề cập đến mô-đun thập phân đầu tiên, bởi vì đó là câu trả lời hoàn toàn đúng. Một điều cần thận trọng một chút với phần còn lại là 'b' trong ví dụ của bạn sẽ được hiển thị là 1324343032.3239999 trên các phiên bản của Python trước 2.7. Và quả thực, đây là giá trị mà OP đang nhìn thấy khi anh ta cố gắng. Tất nhiên, cả hai giá trị đều không thể phân biệt được, theo điểm nhị phân. –

3

Bạn có thể sử dụng chức năng sau đây để cắt xén một số cho một số bộ số thập phân:

import math 
def truncate(number, digits) -> float: 
    stepper = pow(10.0, digits) 
    return math.trunc(stepper * number)/stepper 

Cách sử dụng:

>> truncate(1324343032.324325235, 3) 
>> 1324343032.324 
+1

Điều này thực sự phải là câu trả lời được chấp nhận. Mã đơn giản, thanh lịch và có ý nghĩa nhất. Sử dụng chức năng cắt ngắn tiêu chuẩn, tuy nhiên đầu tiên chuyển vị trí thập phân, dịch chuyển vị trí thập phân trở lại sau khi cắt cụt đã được thực hiện. – CatalystNZ

5

tôi đã tìm thấy một giải pháp khác (nó phải hiệu quả hơn icient hơn "chuỗi phù thủy" cách giải quyết):

>>> import decimal 
# By default rounding setting in python is decimal.ROUND_HALF_EVEN 
>>> decimal.getcontext().rounding = decimal.ROUND_DOWN 
>>> c = decimal.Decimal(34.1499123) 
# By default it should return 34.15 due to '99' after '34.14' 
>>> round(c,2) 
Decimal('34.14') 
>>> float(round(c,2)) 
34.14 
>>> print(round(c,2)) 
34.14 

About decimals module

About rounding settings

-1
>>> float(1324343032.324325235) * float(1000)/float(1000) 

1324343032.3243253 

>>> round(float(1324343032.324325235) * float(1000)/float(1000), 3) 

1324343032.324 
+1

Trong khi đoạn mã này có thể giải quyết câu hỏi, [bao gồm cả giải thích] (http: //meta.stackexchange.com/questions/114762/giải thích toàn bộ mã dựa trên câu trả lời) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. – DimaSan

-1

bạn cũng có thể sử dụng:

import math 

nValeur = format(float(input('Quelle valeur ? ')), '.3f') 

Trong python 3.6 nó sẽ làm việc

0

Sau khi tìm cách giải quyết vấn đề này, không tải bất kỳ mô-đun Python 3 hoặc các phép toán thêm nào, tôi giải quyết vấn đề bằng cách sử dụng chỉ str.format() e .float().Tôi nghĩ cách này nhanh hơn việc sử dụng các phép toán khác, như trong giải pháp commom nhất. Tôi cần một giải pháp nhanh vì tôi làm việc với một tập dữ liệu rất lớn và vì vậy nó hoạt động rất tốt ở đây.

def truncate_number(f_number, n_decimals): 
     strFormNum = "{0:." + str(n_decimals+5) + "f}" 
     trunc_num = float(strFormNum.format(f_number)[:-5]) 
     return(trunc_num) 

# Testing the 'trunc_num()' function 
test_num = 1150/252 
[(idx, truncate_number(test_num, idx)) for idx in range(0, 20)] 

Nó trả về kết quả như sau:

[(0, 4.0), 
(1, 4.5), 
(2, 4.56), 
(3, 4.563), 
(4, 4.5634), 
(5, 4.56349), 
(6, 4.563492), 
(7, 4.563492), 
(8, 4.56349206), 
(9, 4.563492063), 
(10, 4.5634920634), 
(11, 4.56349206349), 
(12, 4.563492063492), 
(13, 4.563492063492), 
(14, 4.56349206349206), 
(15, 4.563492063492063), 
(16, 4.563492063492063), 
(17, 4.563492063492063), 
(18, 4.563492063492063), 
(19, 4.563492063492063)] 
1

Tôi tin rằng sử dụng chức năng định dạng là một ý tưởng tồi. Vui lòng xem phần bên dưới. Nó làm tròn giá trị. Tôi sử dụng Python3.6.

>>> '%.3f'%(1.9999999) 
'2.000' 

Sử dụng regex thay vì:

>>> re.match(r'\d+.\d{3}', str(1.999999)).group(0) 
'1.999' 
Các vấn đề liên quan