مشكلة التقريب غريبة باستخدام روبي printf-تنسيق محدد
-
10-07-2019 - |
سؤال
وقد أي شخص حصل على أي أفكار على هذا واحد؟
وعندما نقوم بتشغيل:
وprintf("%.0f", 40.5)
في مربع النوافذ كانت عودته "41" ولكن على موقعنا على خادم الإنتاج أوبونتو نحن نحصل على "40"
المحلول
ويبدو وكأنه حالة بسيطة من العائمة ثنائي نقطة عدم الدقة . على آلة واحدة تحصل 40،499999999 التي جولات إلى 40؛ على الجهاز الآخر تحصل 40،500000000001 التي جولات إلى 41.
إذا كنت بحاجة إلى أرقام دقيقة ثم يجب عدم استخدام نقطة عائمة الثنائية. يمكنك استخدام عشري نقطة ثابتة، أو النقطة العائمة عشرية.
وتحرير: كنت تستخدم BigDecimal، ويقول لك. لماذا لا تجنب أي تحويل لتعويم باستخدام #round
ثم #to_i
؟ (أو #floor
أو #ceil
بدلا من #round
... انها ليست واضحة ما هو هدفك.)
b = BigDecimal.new("40.5")
print b.round.to_i # => 41
نصائح أخرى
وماذا عن استخدام .round
بدلا من ذلك؟ القضبان حتى يعزز بحيث يمكنك تحديد الدقة ( نرى API وثيقة ).
استخدم٪ .0g بدلا
والجواب ScottJ للا يفسر مشكلتك - 40.5 هو للتمثيل بالضبط في ثنائي. ما ربما يحدث هذا: "جولات نصف حتى" printf ويندوز "جولات نصف تصل"، وprintf أوبونتو