مشكلة التقريب غريبة باستخدام روبي printf-تنسيق محدد

StackOverflow https://stackoverflow.com/questions/1819250

سؤال

وقد أي شخص حصل على أي أفكار على هذا واحد؟

وعندما نقوم بتشغيل:

و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 أوبونتو

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top