หลังจากดูคำตอบของคำถามที่คล้ายกันหลายข้อดูเหมือนว่าจะเป็นทางออกที่ดีที่สุดสำหรับฉัน:
def floatToString(inputValue):
return ('%.15f' % inputValue).rstrip('0').rstrip('.')
เหตุผลของฉัน:
%g
ไม่กำจัดสัญกรณ์วิทยาศาสตร์
>>> '%g' % 0.000035
'3.5e-05'
15 ตำแหน่งทศนิยมดูเหมือนจะหลีกเลี่ยงพฤติกรรมที่แปลกและมีความแม่นยำมากมายสำหรับความต้องการของฉัน
>>> ('%.15f' % 1.35).rstrip('0').rstrip('.')
'1.35'
>>> ('%.16f' % 1.35).rstrip('0').rstrip('.')
'1.3500000000000001'
ฉันสามารถใช้format(inputValue, '.15f').
แทนได้'%.15f' % inputValue
แต่มันช้าลงเล็กน้อย (~ 30%)
ฉันสามารถใช้งานได้Decimal(inputValue).normalize()
แต่ก็มีปัญหาเล็กน้อยเช่นกัน สำหรับหนึ่งมันช้ากว่ามาก (~ 11x) normalize()
ฉันยังพบว่าแม้ว่ามันจะมีความแม่นยำมากสวยก็ยังคงได้รับความทุกข์จากการสูญเสียความแม่นยำเมื่อใช้
>>> Decimal('0.21000000000000000000000000006').normalize()
Decimal('0.2100000000000000000000000001')
>>> Decimal('0.21000000000000000000000000006')
Decimal('0.21000000000000000000000000006')
สิ่งสำคัญที่สุดคือฉันจะยังคงเปลี่ยนDecimal
จากสิ่งfloat
ที่สามารถทำให้คุณจบลงด้วยสิ่งอื่นนอกเหนือจากหมายเลขที่คุณใส่ไว้ ฉันคิดว่าDecimal
ทำงานได้ดีที่สุดเมื่อเลขคณิตอยู่ในDecimal
และDecimal
เริ่มต้นได้ด้วยสตริง
>>> Decimal(1.35)
Decimal('1.350000000000000088817841970012523233890533447265625')
>>> Decimal('1.35')
Decimal('1.35')
ฉันแน่ใจว่าDecimal.normalize()
สามารถแก้ไขปัญหาความแม่นยำของสิ่งที่จำเป็นโดยใช้การตั้งค่าบริบท แต่เมื่อพิจารณาความเร็วที่ช้าอยู่แล้วและไม่ต้องการความแม่นยำที่ไร้สาระและความจริงที่ว่าฉันยังคงแปลงจากการลอยและการสูญเสียความแม่นยำอยู่ดี ไม่คิดว่ามันคุ้มค่าที่จะติดตาม
ฉันไม่กังวลกับผลลัพธ์ "-0" ที่เป็นไปได้เนื่องจาก -0.0 เป็นเลขทศนิยมที่ถูกต้องและอาจเป็นเหตุการณ์ที่เกิดขึ้นได้ยาก แต่เนื่องจากคุณพูดถึงว่าคุณต้องการให้ผลลัพธ์สตริงสั้นที่สุดเท่าที่จะทำได้ สามารถใช้เงื่อนไขเพิ่มเติมได้เสมอด้วยค่าใช้จ่ายที่เพิ่มขึ้นเล็กน้อย
def floatToString(inputValue):
result = ('%.15f' % inputValue).rstrip('0').rstrip('.')
return '0' if result == '-0' else result
3.14 == 3.140
- พวกมันเป็นเลขทศนิยมเหมือนกัน สำหรับเรื่องนั้น 3.140000 นั้นเป็นเลขทศนิยมเหมือนกัน ไม่มีศูนย์ในตอนแรก