คุณต้องการปัดเศษคำตอบของคุณ
round(value,significantDigit)
เป็นทางออกที่สามัญเพื่อทำเช่นนี้อย่างไรก็ตามเรื่องนี้บางครั้งก็ไม่สามารถทำงานได้เป็นหนึ่งคาดหวังจากมุมมองทางคณิตศาสตร์เมื่อหลักรองลงมาทันที (ไปทางซ้ายของ) 5
หลักที่คุณกำลังปัดเศษมี
นี่คือตัวอย่างของพฤติกรรมที่คาดเดาไม่ได้:
>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01
สมมติว่าเจตนาของคุณคือการทำปัดเศษแบบดั้งเดิมสำหรับสถิติในวิทยาศาสตร์นี้เป็นเสื้อคลุมที่มีประโยชน์ที่จะได้รับround
ฟังก์ชั่นการทำงานตามที่คาดไว้ต้องสิ่งที่พิเศษเช่นimport
Decimal
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
Aha! จากนี้เราสามารถสร้างฟังก์ชัน ...
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
โดยทั่วไปสิ่งนี้จะเพิ่มค่าเล็กน้อยให้กับสตริงเพื่อบังคับให้ปัดเศษขึ้นอย่างถูกต้องในอินสแตนซ์ที่ไม่สามารถคาดเดาได้ซึ่งมันไม่ได้มีround
ฟังก์ชั่นตามปกติเมื่อคุณคาดหวัง ค่าที่สะดวกในการเพิ่มเป็น1e-X
ที่X
เป็นความยาวของสตริงหมายเลขที่คุณกำลังพยายามที่จะใช้ในการบวกround
1
วิธีการใช้10**(-len(val)-1)
นั้นมีความรอบคอบเนื่องจากเป็นจำนวนน้อยที่สุดที่คุณสามารถเพิ่มเพื่อบังคับให้เปลี่ยนได้ในขณะที่ยังมั่นใจได้ว่าค่าที่คุณเพิ่มจะไม่เปลี่ยนการปัดเศษแม้ว่าทศนิยม.
จะหายไป ฉันสามารถใช้เพียงแค่10**(-len(val))
มีเงื่อนไขif (val>1)
เพื่อลบ1
มากกว่า ... แต่มันง่ายกว่าที่จะลบเสมอ1
เพราะมันจะไม่เปลี่ยนช่วงจำนวนทศนิยมที่ใช้บังคับวิธีแก้ปัญหานี้สามารถจัดการได้อย่างถูกต้อง วิธีการนี้จะล้มเหลวหากค่าของคุณถึงขีด จำกัด ของประเภทนี้จะล้มเหลว แต่สำหรับเกือบทุกช่วงของค่าทศนิยมที่ถูกต้องที่ควรใช้
ดังนั้นรหัสที่เสร็จแล้วจะเป็นดังนี้:
def main():
printC(formeln(typeHere()))
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1))
def typeHere():
global Fahrenheit
try:
Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
except ValueError:
print "\nYour insertion was not a digit!"
print "We've put your Fahrenheit value to 50!"
Fahrenheit = 50
return Fahrenheit
def formeln(c):
Celsius = (Fahrenheit - 32.00) * 5.00/9.00
return Celsius
def printC(answer):
answer = str(roundTraditional(answer,2))
print "\nYour Celsius value is " + answer + " C.\n"
main()
... ควรให้ผลลัพธ์ที่คุณคาดหวัง
คุณสามารถใช้ไลบรารีทศนิยมเพื่อทำสิ่งนี้ แต่ wrapper ที่ฉันเสนอนั้นง่ายกว่าและอาจเป็นที่ต้องการในบางกรณี
แก้ไข:ขอบคุณBlckknghtสำหรับการชี้ให้เห็นว่า5
กรณีที่เกิดขึ้นเฉพาะสวัสดิการค่าบางอย่างที่นี่