מתמטיקה בשפת php לא נותן תוצאה רצויה
-
שלום וברכה לכולם יש לי קוד php שמקבל מספר ומבצע עליו מספר חישובים מתמטיים
אני אתן דוגמא נניח ושלחתי לו את המספר 752 אז בהתחלה אני לוקח את המספר (כל הפעולות נדרשות למהלך הקוד כמובן) ומחלק אותו במאה מבצע פעולות מסוימות מכפיל בעשר מבצע וכולי כדי להתייחס בנפרד למספרי העשרות אחדות מאות וכולי
כדי שזה יצא טוב אז מה שאני עושה זה שלאחר החלוקה למאה אני משתמש בפונקציה floor על מנת לקבל את המספר הנמוך לדוגמא המספר הנ"ל לאחר חלוקה למאה יוצא 7.52 אז הפונקציה הנ"ל מחזירה את הערך 7 וכך אני עושה 7.52-7 ואת התוצאה כפול עשר
מקווה שהייתי ברור עד עכשיו
עכשיו עד כאן הכל טוב אבל נתקלתי בשני בעיות
1 לאחר ששלחתי מספרים קשה לומר בוודאות איזה אבל יתכן שברוב הפעמים זה היה זוגי בזמן שהיה בעיה לא בטוח אז לפעמים אם אחרי כל הסיבוב יצא המספר 6 לדוגמא אז הפונקציה החזירה את הערך 5 וכך בעצם זה גם הפריע לחשבון וגם יצא אחד מיותר
2 לפעמים אחרי ההפחתה לא יצא המספר המתאים לדוגמא אם יצא בסוף 7 והפונקציה החזירה 7 ובצעתי הפחתה של המספר הראשון בשני אז יצא לי את המספר הבא (הועתק מהדפדפן ואין לי מושג איך ) 8.8817841970013E-16
כמובן שזה מאוד מוזר או שאם יצא המספר 5 אחרי הבעיה הקודמת שהזכרתי אז לאחר ההפחתה של 6 פחות 5 יצא לי את המספר הבא 0.99999999999998
עד כאן הבעיה
כמובן שזה מפריע לכל מהלך החישוב אז אם למישהו יש הסבר על הבעיה ו/או דרך איך לפתור אני ממש אודה לו
ממש מתנצל על האריכות זה פשוט היה כדי להסביר הכי טוב שיכולתי ולמנוע מצב שאנשים רוצים לעזור ולא מצליחים
מקווה שהייתי ברור מספיק אם לא אשמח לענות
תודה רבה רבה -
זה קורה כי בPHP כל המספרים הם מסוג "מספר צף", שזה מספר עם דיוק מוגבל.
(תוכל לקרוא על זה פה: https://www.hamichlol.org.il/נקודה_צפה).חיפשתי באינטרנט על הבעיה שלך (חילוץ שבר עשרוני), ומצאתי על זה לא מעט.
פה מובא פיתרון להשתמש עם פונקציית bcsub שמבצעת חיסור עם הגדרה כמה ספרות לדייק.
זה אומר שכשיש לך את המשתנה עם השלם בלבד שהשגת בזכות הfloor, אתה לא מחסר ישירות אלא עם הפונקציה הזו, ככה:echo bcsub(mispar, misparFloor, 20);
-
@dovid לא תייגת אותי אז לא קבלתי התראה במייל
הרעיון שלך גאוני
קודם כל נהנתי מעצם הגדרת הבעיה דבר שאני לא הצלחתי לעשות למרות שהצלחתי להסביר את הבעיה
עשיתי את זה עכשיו יש לי שתי שאלות
אחד אני מבין שזה יותר מקצועי אבל למה זה עדיף על פני הרעיון האחר המובא שם של פיצול לפי נקודה?
שתיים איך אוכל לוודא באמת שזה כבר לא יקרה שוב ואסביר את השאלה את הבעיה הזאת גיליתי באקראי כי זה לא קורה לכל המספרים (עברתי על הקישור שהבאת הבנתי בערך את הבסיס אצטרך לעבור שוב אבל לא ממש הבנתי למה זה לא קורה לכל המספרים) רק במהלך בדיקות שבצעתי הרצתי מספרים שונים ובדיוק יצא מספר לא תקין ניסיתי מספרים דומים וישבתי הרבה זמן עד שגילית את המקום ששם מתחילים הבעיות (כמובן בלי להבין למה עד שהארת את עיני ) אז עכשיו לא ניסיתי את כל המספרים האפשריים במקרה שלי אז מי אמר שזה לא יקרה במספרים אחרים (אני כתבתי כמו שהבאת שהגדרת הדיוק תהיה 20) ?
תודה רבה רבה על המענה המהיר וההסבר המדויק והקישורים הנלווים -
א. הבעיה של נקודה צפה ידועה, כך שניחשתי די מהר את הבעיה.
ב. הפתרון של פיצול לפי נקודה אכן טוב, אני לא כתבתי אותו כי זה שימושי להצליח לעבוד בצורה מדוייקת עם מספרים בלי קשר לבעיה שלך הספציפית.
ג. אני אל בטוח שהפתרון שהבאתי עובד, אבל היה לי מקרה לבדיקה שהובא שם בסטאק, 510.9, שבזה הפתרון עובד והנחתי שזה עובד בכל מקרה (בצירוף עם המוניטין של המשיב שמה). כיון שאני לא מסוגל לשבת ולהבין את הבעיה של נקודה צפה לפרטיה אז אני אכן לא יודע אפילו בתיאוריה שהפתרון אמור לעזור, אבל אתה יכול לשבת ולנסות להבין, זה לא מדעי טילים, זה סה"כ מספרים.