Re: [心得] 跟 PM 談需求談到快崩潰

作者: yamiyodare (shantotto)   2016-05-14 05:13:30
※ 引述《cyclone350 (老子我最神)》之銘言:
: 純抱怨
: 不知道大家是怎麼跟 PM 談需求的
: 我最近談需求快要崩潰了
: 我明明只是一個很單純很簡單的疑問
: 莫名其妙就要講一小時,而且跟我的問題完全無關
: 我每次希望把問題拉回來,但 PM 就是會把問題奇妙化,講一堆五四三
: 舉個例子:
: PM 提了一個打折需求,我需要知道若商品打折後有小數點是如何進位
: 1. 四捨五入 2. 無條件進位 3. 無條件捨去
離題一下, 這個問題其實比想像中要麻煩.
舉個例 (compiler 與 compiler option 若不同結果可能也有差異)
int price = 25;
float discount = 0.88;
printf("%.10f\n", price * discount); // 21.9999998808
printf("%d\n", (int)(price * discount)); // 21
printf("%d\n", (int)floorf(price * discount)); // 22
printf("%d\n", (int)(price * 0.88f)); // 21
printf("%d\n", (int)(price * 0.88)); // 22
printf("%d\n", 1191567 * 88 / 100); // 1048578
printf("%d\n", (int)(1191567 * 0.88)); // 1048578
printf("%d\n", (int)floorf(1191567 * 0.88)); // 1048579
printf("%d\n", (int)floor(1191567 * 0.88)); // 1048578
就算用 double 提高精確度, 浮點的四捨五入也要先釐清
round half away from zero, round half to even 等差異
IEEE 754 預設用 round half to even (banker's rounding) 跟小學數學教的不同
在值域容許的範圍內, 改用整數運算比較不容易出錯.
N 如果要打 88 折, 會變成
無條件捨去 (N * 88) / 100
小學四捨五入 ((N * 88) + (100 / 2)) / 100
無條件進位 ((N * 88) + (100 - 1)) / 100
實際上線前還有些問題需要 PM 先想清楚
比如說買了一堆東西, 打折是總價打折還是單價打折加總?
作者: discoby (黑皮)   2016-05-16 07:36:00
這篇回文的作者不是已經說了 離題一下?不能離題一下嗎?
作者: iman00b   2016-05-15 15:25:00
推一樓XD
作者: cyclone350 (老子我最神)   2016-05-15 18:15:00
推一樓XD
作者: xam (聽說)   2016-05-14 11:14:00
除了搞不清楚狀況的PM以外,這篇示範了搞不清楚狀況的技術人員
作者: comesuck (艾米德)   2016-05-14 11:31:00
我看這個案子慘了
作者: O187 (187cm)   2016-05-14 17:34:00
推1樓XD
作者: yamiyodare (shantotto)   2016-05-14 18:44:00
請指教 我很樂意學習
作者: steven11329 (清新柳橙)   2016-05-14 18:54:00
原po重點錯吧!
作者: brucetu (sec)   2016-05-14 21:52:00
這些是pg的事情,是pg要去滿足常識上的四捨五入 無條件進捨所以user三選一之後就沒什麼好再細問的了打折規則倒是要問沒錯 原本那篇只是探討88折後小數怎麼辦 倒是跟打折如何加總沒有關係
作者: viper9709 (阿達)   2016-05-14 22:27:00
一樓神回覆XD
作者: JackBaska (Baska)   2016-05-16 15:37:00
離題示範一下搞不清楚狀況的技術人員

Links booklink

Contact Us: admin [ a t ] ucptt.com