Làm tròn số dấu phẩy động xuống số nguyên gần nhất?


127

Như tiêu đề cho thấy, tôi muốn lấy một số dấu phẩy động và làm tròn nó xuống số nguyên gần nhất. Tuy nhiên, nếu nó không phải là toàn bộ, tôi LUÔN muốn làm tròn biến, bất kể nó gần với số nguyên tiếp theo như thế nào. Có cách nào để làm việc này không?


2
Một khó khăn có thể là các định dạng dấu phẩy động của IEEE có thể biểu thị các số lớn đến mức độ lớn hơn 1. Vì vậy, trong khi bạn có thể làm tròn x xuống làm tròn x + 1 xuống sẽ không cho bạn kết quả như bạn mong đợi.
dmckee --- ex-moderator mèo con

Xin vui lòng gửi một số ví dụ.
Ashwini Chaudhary

Câu trả lời:


178

Đơn giản

print int(x)

cũng sẽ làm việc


7
int (0,6) = 0 thay vì 1
Helin Wang

39
@HelinWang Đó chính xác là những gì OP yêu cầu.
Petr Peller

5
Đây có vẻ như là cách tiếp cận Pythonic nhất.
Gyan Veda

23
Điều này hoạt động tốt cho các số dương, nhưng số âm sẽ được làm tròn:int(-23.3) == 23
Alex Riley

2
và không hoạt động đối với số vượt quá phạm vi số nguyên, chẳng hạn như 600851485143, về cơ bản nó sẽ đánh dấu lỗi bộ nhớ.
Muyide Ibukun

77

Một trong số này nên hoạt động:

import math
math.trunc(1.5)
> 1
math.trunc(-1.5)
> -1
math.floor(1.5)
> 1
math.floor(-1.5)
> -2

14
Đầu ra từ math.trunclà một số nguyên, trong khi đầu ra của math.floorlà float.
evedovelli

6
@evedovelli: Không thực sự nữa. type(math.floor(1.51)) -> inttype(math.trunc(1.51)) -> intkể từpython 3.6.0
SKPS

4
Các tùy chọn này rõ ràng hơn "int (x)" và do đó có nhiều Pythonic hơn.
Tristan

43
x//1

Nhà //điều hành trả lại sàn của bộ phận. Vì chia cho 1 không thay đổi số của bạn, điều này tương đương với sàn nhưng không cần nhập. Ghi chú:

  1. Điều này trả về một float
  2. Vòng này hướng tới -∞

Bổ sung tốt đẹp. int(-1.1) == -1trong khi -1.1//1 == -2.0tuy nhiên decimal.Decimal('-1.1')//1 == decimal.Decimal('-1')(như tài liệu, điểm 2 là không đúng đối với decimal), do đó dựa vào cách //cư xử không phải là hoàn toàn ổn định, thậm chí ngày hôm nay.
Tino

28

Để có kết quả dấu phẩy động, chỉ cần sử dụng:

round(x-0.5)

Nó hoạt động cho các số âm là tốt.


6
cực kỳ tinh vi đó là
Alon


9

Rất nhiều người nói để sử dụng int(x), và điều này hoạt động tốt trong hầu hết các trường hợp, nhưng có một vấn đề nhỏ. Nếu kết quả của OP là:

x = 1.9999999999999999

nó sẽ làm tròn đến

x = 2

sau ngày 9 tháng 9 nó sẽ tròn. Đây không phải là một vấn đề lớn nếu bạn chắc chắn rằng bạn sẽ không bao giờ gặp phải điều đó. Nhưng đó là điều cần lưu ý.


17
Đó là bởi vì 1.9999999999999999thực sự bằng với 2.0đại diện float64 bên trong. I E. nó đã được làm tròn ngay khi được phân tách thành hình nổi, vì số float 64 bit không thể biểu thị nhiều chữ số có nghĩa. Bạn có thể xác minh rằng với việc đánh giá 1.9999999999999999 == 2.0. Và nếu bạn nghi ngờ rằng hoạt động bằng có thực hiện một số làm tròn trên phao, bạn có thể so sánh biểu diễn nhị phân với struct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0), cũng bằng nhau.
blubberdiblub

4
Và nếu đó chính xác là quan điểm của bạn, thì tôi không thấy có gì sai int(). Giá trị đã là 2.0 và nó sẽ chuyển đổi hạnh phúc thành 2.
blubberdiblub

1
Nếu ý định của OP (hoặc bất kỳ ai đọc điều này trong tương lai) là sử dụng số nguyên gần nhất (chứ không phải giá trị làm tròn) vì bất kỳ lý do gì, thì đó sẽ là điều cần lưu ý.
lokilindo

3
@lokilindo Nhưng điều này không có gì để làm int(), nó chỉ liên quan đến việc sử dụng không đúng cáchfloat , như 1.9999999999999999được làm tròn đến 2.0 lúc biên dịch (trong khi int()được gọi là thời gian thực hiện). Nếu bạn sử dụng đúng loại dữ liệu cho biến, mọi thứ sẽ hoạt động như mong đợi: int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))cho1
Tino

6

Nếu bạn không muốn nhập toán, bạn có thể sử dụng:

int(round(x))

Đây là một phần của tài liệu:

>>> help(round)
Help on built-in function round in module __builtin__:

round(...)
    round(number[, ndigits]) -> floating point number

    Round a number to a given precision in decimal digits (default 0 digits).
    This always returns a floating point number.  Precision may be negative.

Cảm ơn câu trả lời của bạn. Lần tới, bạn sẽ nhận được sự tiếp nhận tốt hơn nếu bạn viết mã thích hợp (đóng ngoặc đơn) và đưa ra một số tài liệu.
Geoff

2
roundđã được thảo luận và từ chối như một câu trả lời khi câu hỏi này đã được hỏi một năm trước. OP muốn math.floor.
Adam Smith

3

Nếu bạn làm việc với numpy, bạn có thể sử dụng giải pháp sau đây cũng hoạt động với các số âm (nó cũng hoạt động trên các mảng)

import numpy as np
def round_down(num):
    if num < 0:
        return -np.ceil(abs(num))
    else:
        return np.int32(num)
round_down = np.vectorize(round_down)

round_down([-1.1, -1.5, -1.6, 0, 1.1, 1.5, 1.6])
> array([-2., -2., -2.,  0.,  1.,  1.,  1.])

Tôi nghĩ nó cũng sẽ hoạt động nếu bạn chỉ sử dụng mathmô-đun thay vì numpymô-đun.


1

Không biết bạn đã giải quyết vấn đề này chưa, nhưng tôi chỉ vấp phải câu hỏi này. Nếu bạn muốn loại bỏ các dấu thập phân, bạn có thể sử dụng int (x) và nó sẽ loại bỏ tất cả các chữ số thập phân. Không cần sử dụng vòng (x).


1

Chỉ cần thực hiện làm tròn (x-0,5), điều này sẽ luôn trả về giá trị Số nguyên được làm tròn tiếp theo của Float của bạn. Bạn cũng có thể dễ dàng làm tròn bằng cách làm tròn (x + 0,5)


-1

Nó có thể rất đơn giản, nhưng bạn không thể làm tròn nó sau đó trừ đi 1? Ví dụ:

number=1.5
round(number)-1
> 1

4
Điều này đưa ra câu trả lời sai cho toàn bộ số nguyên. Chẳng hạn, 2.0 làm tròn lên là 2 và nếu bạn trừ đi 1, bạn sẽ nhận được kết quả không chính xác 1.
Pascal Cuoq

@PascalCuoq Tôi không hiểu vấn đề của bạn. Bạn có muốn kết quả là 1.0 không? Bởi vì OP rõ ràng muốn làm tròn sau đó đánh số đến gần nhất integer.
bad_keypoint 14/05/2015

1
@bad_keypoint Tôi không nghĩ rằng OP muốn làm tròn 2.0 đến 1.
Pascal Cuoq

@PascalCuoq xin lỗi, tôi chỉ nhìn lại câu trả lời trong luồng nhận xét mà chúng tôi đang có.
bad_keypoint

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.