יום רביעי, דצמבר 21, 2011

You can't trust XSL with numbers

??? 9.90 - 10 = 0.0999674-


לזה אני קורא פיטצר הזויי , כאשר משתמשים ביכולת ה XSL של מוזילה (הכל מ 4 ) מתברר שפעולות חישוב המכילות מספרים עשורניים זה משהוא שאסור לסמוך עליו.

בשביל לגלות את פשוט תבצעו פעולת select לשתי שדות המכילים מספרים בעלי נקודה עשרונית.

פיספסתי קצת כנראה בתיעוד ורק בדיעבד גיליתי כי לאחר פעולות חישוב עלי לבצע format-string כלומר :


<xsl:value-of select="format-number(EXPRESSION,'###,##0.######')">

כאשר ה EXPRESSION הוא הפעולה החשבונית אותה אתם עושים. ותודה לעוץליגוץלי שהעלה לי את הרעיון.
לדוגמה EXPRESSION :
  • 1 div 2
  • 1 div 3
  • element_name - other_element_name
חמוד לא ?

3 תגובות:

  1. זה 9.9-10=0.0999 או 10-9.9=0.0999

    אם זה השני, אז זה ממש לא באג... כי ככה חישוב ב-floating point מתבצע אבל אם זה הראשון 0.1 במקום מינוס 0.1 אז זה רציני.

    השבמחק
  2. זה לא באג של מוזילה, זו הצורה שמעבד X86 עובד. אתה תראה אותה התוצאה גם בkhtml (קונקרור, ספארי, כרום) וגם באקספלורר. ואם תבצע את החישוב בC על מספרים מסוג float, תקבל אותה תוצאה.
    תצוגה בעיגול של 6 ספרות משמעותיות (עבור float), או 14 ספרות משמעותיות (עבור double) תפתור לך את הבעיה.

    השבמחק
  3. בוריס... תחפש בגוגל

    what every programmer should know about floating point arithmetic...

    ותראה שאתה כ"מתכנת" צריך לדעת על זה...

    השבמחק