ตามชื่อเรื่องฉันต้องการหาจำนวนทศนิยมแล้วปัดเศษลงเป็นจำนวนเต็มที่ใกล้ที่สุด อย่างไรก็ตามหากไม่ใช่จำนวนเต็มฉันมักต้องการปัดเศษของตัวแปรไม่ว่าจะใกล้เคียงกับจำนวนเต็มถัดไปเท่าใดก็ตาม มีวิธีทำไหม?
ตามชื่อเรื่องฉันต้องการหาจำนวนทศนิยมแล้วปัดเศษลงเป็นจำนวนเต็มที่ใกล้ที่สุด อย่างไรก็ตามหากไม่ใช่จำนวนเต็มฉันมักต้องการปัดเศษของตัวแปรไม่ว่าจะใกล้เคียงกับจำนวนเต็มถัดไปเท่าใดก็ตาม มีวิธีทำไหม?
คำตอบ:
ง่าย
print int(x)
จะทำงานเช่นกัน
int(-23.3) == 23
หนึ่งในนั้นควรใช้งานได้:
import math
math.trunc(1.5)
> 1
math.trunc(-1.5)
> -1
math.floor(1.5)
> 1
math.floor(-1.5)
> -2
math.trunc
เป็นจำนวนเต็มในขณะที่ผลลัพธ์ของmath.floor
เป็นทศนิยม
type(math.floor(1.51)) -> int
และtype(math.trunc(1.51)) -> int
ณ วันที่python 3.6.0
x//1
ตัว//
ดำเนินการส่งคืนพื้นของการหาร เนื่องจากการหารด้วย 1 ไม่ได้ทำให้ตัวเลขของคุณเปลี่ยนไปจึงเทียบเท่ากับขั้นต่ำ แต่ไม่จำเป็นต้องนำเข้า หมายเหตุ:
int(-1.1) == -1
ในขณะที่-1.1//1 == -2.0
อย่างไรก็ตามdecimal.Decimal('-1.1')//1 == decimal.Decimal('-1')
(ตามเอกสารอ้างว่า 2 ไม่เป็นความจริงสำหรับdecimal
) ดังนั้นการพึ่งพา//
พฤติกรรมจึงไม่คงที่อย่างสมบูรณ์แม้ในปัจจุบัน
ฉันคิดว่าคุณต้องการฟังก์ชั่นพื้น:
หลายคนบอกว่าให้ใช้int(x)
และมันก็ใช้ได้สำหรับกรณีส่วนใหญ่ แต่มีปัญหาเล็กน้อย หากผลของ OP คือ:
x = 1.9999999999999999
มันจะปัดเศษเป็น
x = 2
หลังจากวันที่ 16 9 จะออกรอบ นี่ไม่ใช่เรื่องใหญ่หากคุณแน่ใจว่าจะไม่มีวันเจอเรื่องแบบนี้ แต่เป็นสิ่งที่ควรคำนึงถึง
1.9999999999999999
จริง ๆ แล้วเท่ากับ2.0
ในการแสดง float64 ภายใน I. จ. มันถูกปัดเศษทันทีที่แยกวิเคราะห์เป็นทศนิยมเนื่องจากทศนิยม 64 บิตไม่สามารถแสดงตัวเลขที่มีนัยสำคัญจำนวนมากได้ 1.9999999999999999 == 2.0
คุณสามารถตรวจสอบได้ว่ามีการประเมิน และหากคุณสงสัยว่าการดำเนินการเท่ากับทำการปัดเศษบนโฟลตคุณสามารถเปรียบเทียบการแทนค่าไบนารีstruct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0)
ซึ่งมีค่าเท่ากันได้เช่นกัน
int()
และถ้าเกิดว่าตรงจุดของคุณแล้วผมไม่เห็นอะไรผิดปกติกับ ค่าเป็น 2.0 แล้วและจะแปลงเป็น 2 อย่างมีความสุข
int()
ไม่เกี่ยวข้องกับการใช้งานที่ไม่เหมาะสมfloat
เท่านั้นเนื่องจาก1.9999999999999999
จะปัดเศษขึ้น2.0
ในเวลาคอมไพล์ (ในขณะที่int()
เรียกว่าเวลาดำเนินการ) หากคุณใช้ประเภทข้อมูลที่ถูกต้องสำหรับตัวแปรทุกอย่างจะทำงานได้ตามที่คาดไว้: int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))
ให้1
หากคุณไม่ต้องการนำเข้าคณิตศาสตร์คุณสามารถใช้:
int(round(x))
นี่คือส่วนหนึ่งของเอกสาร:
>>> 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.
round
มีการพูดคุยและปฏิเสธเป็นคำตอบเมื่อมีการถามคำถามนี้เมื่อปีที่แล้ว math.floor
ต้องการ OP
หากคุณทำงานกับ numpy คุณสามารถใช้วิธีแก้ปัญหาต่อไปนี้ซึ่งใช้ได้กับจำนวนลบเช่นกัน (มันทำงานกับอาร์เรย์ด้วย)
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.])
ฉันคิดว่ามันจะใช้ได้เช่นกันถ้าคุณใช้math
โมดูลแทนnumpy
โมดูล
ไม่ทราบว่าคุณแก้ไขได้หรือไม่ แต่ฉันเพิ่งสะดุดกับคำถามนี้ หากคุณต้องการกำจัดจุดทศนิยมคุณสามารถใช้ int (x) และมันจะกำจัดหลักทศนิยมทั้งหมด ไม่จำเป็นต้องใช้ round (x)
เพียงแค่ทำรอบ (x-0.5) สิ่งนี้จะส่งกลับค่าจำนวนเต็มที่ปัดลงถัดไปของ Float ของคุณเสมอ คุณยังสามารถปัดเศษขึ้นได้อย่างง่ายดายโดยทำรอบ (x + 0.5)
มันอาจจะง่ายมาก แต่คุณปัดมันขึ้นมาแล้วลบ 1 ไม่ได้เหรอ? ตัวอย่างเช่น:
number=1.5
round(number)-1
> 1
integer
ต้องการอย่างชัดเจนไปยังหมายเลขแล้วรอบออกไปที่ใกล้ที่สุด
ฉันใช้รหัสนี้โดยที่คุณลบ 0.5 ออกจากตัวเลขและเมื่อคุณปัดเศษมันจะเป็นตัวเลขเดิมที่ปัดลง
รอบ (a-0.5)