※ 引述《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 先想清楚
比如說買了一堆東西, 打折是總價打折還是單價打折加總?