עבור לתוכן

שאלה בג'אווה לגבי קאסטינג

Featured Replies

פורסם

105 --> 105.0

120.506 --> 120.5

187.2389 --> 187.23

אני צריך לעשות שהמספר יהיה עם שתי ספרות אחרי הנקודה לא בעזרת printf

המספר הראשוני הוא דאבל אז חשבתי להדפיס אותו כאשר הוא int ואז להדפיס נקודה, ואז להפדיס את המספר בדאבל פחות המספר ב int כדי שישאר מספר כגון 0.305 למשל ואז לכפול במאה.

הבעיה היא שזה משאיר 30 ואני צריך שזה ישאיר 3 כמו בדוגמא השניה למעלה

אני צריך לעשות את זה בעזרת קאסטינג.....

אשמח לקבל תשובה

ח

פורסם

אתה יכול לבדוק מודולו 10 ואז לחלק ב 10.


result %10 !=0 ? result : result/10

הגישה שלך די יצריתית, שזה מגניב, אבל היא גם קצת שבורה.

לדוגמה:


In [6]: f = 22.9

In [7]: "%d.%d" % (int(f),int((f-int(f)) * 100))
Out[7]: '22.89'

זה פייתון,אבל זה אמור לתת לך אותה תוצאה ב java או C לצורך העניין... זה כן שונה ממעבד למעבד.

למה זה קורה? ההסבר קצת ארוך, אבל תחשוב על ככה:

כמה מספרים מספרים ממשיים (כאלה שאתה יכול לצייר על גרף המספרים, לדוגמה 1.543 , 0 או 42. השורש של 2 לדוגמה הוא לא כזה)

אתה יכול למצוא בין 0 ל 1 ? אינסופ. נכון?

עכשיו, איך אתה מייצג אינסוף אפשרויות בעזרת גודל סיפי? אתה לא. אתה עושה קרובים, ככל שיש ביטים לשחק איתם הקירובים

שלך יהיו מדוייקים יותר ( double מדוייק יותר מ float ). אבל אתה אף פעם לא תהיה מדוייק בכל המקרים.

נסה את זה, גש לקומפיילר הקרוב לביתך ותן לו לפתור בשבילך: 0.2 + 0.1 הנה לך ספויילר :P :


In [10]: 0.2 + 0.1 == 0.3

Out[10]: False
In [11]: 0.2 + 0.1
Out[11]: 0.30000000000000004

מגניב, לא? בקיצור: תהיה מאוד זהיר עם floating point . וזכור את הכלל הפשוט הבא: כפל לפני חיבור.

הסיבה לזה קצת טכנית (כאילו שכל השאר לא :) ). זה קשור לעניין שהוא שמור

את המספר כחזקה ובסיס, כשאתה מחבר\מחסר הוא צריך להתאים את החזקות

של 2 המספרים, כאן אתה מאבד דיוק. כפל, הוא רק מחבר את החזקות ומכפיל את הבסיס.

הנה, תביט בקוד הזה:



In [21]: "%d.%d" % (int(f),int(int(f*100) - int(f)*100 ))
Out[21]: '22.90'

פורסם

אתה יכול לבצע casting של המספר כפול 100 ל-int. מה קיבלנו? את כל ספרות המספר + 2 אחרי הנקודה.

תחשוב מה אתה עושה מפה.

פורסם
  • מחבר

תודה vitali_pe הבנתי למה זה עושה לי טעויות....אבל עדיין לא הבנתי את הפתרון

ולתגובה השניה

אם יש לי 120.506 ואני מכפיל במאה יוצא 12050.6 הפכתי ל int

יוצא 12050 אני מוריד מזה את ה 12000 יוצא 50

וזה עדיין לא יצא בסדר כי אני צריך רק שה 5 יופיע בלי ה 0

פורסם

בדיקה פשוטה תאפשר לך לבדוק האם הספרה האחרונה היא 0 (מודולו 10) ולטפל במקרה בהתאם.

פורסם

או לעשות קאסטינג חזרה ואז לחלק ב 100

פורסם
  • מחבר

תודה!

הצלחתי בעזרתכם

עשיתי על ידי חילוק במאה לאחר השגת שתי הספרות והוספתי למספר לאחר שהמרתי אותו ל int

פורסם

הבנתי למה זה עושה לי טעויות....אבל עדיין לא הבנתי את הפתרון

הקטע קוד בסוף? זהה לפתרון שלך, רק סדר הפעולות שונה, הכפל בא ראשון.

הרעיון של גיל היה מצויין. אתה אפילו לא צריך לגעת במשתנה אחרי ה cast , מספיק:



In [185]: num
Out[185]: 1234567890


In [186]: num /10**5
Out[186]: 12345


In [187]: num % 10**5
Out[187]: 67890

זה בעצם fixed point number.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים