最近有人在分享這個文章,
原本當作看笑話的我,回頭審視了一下裡面的內容,突然有另一個層面的看法.....
畢竟也是軟體方面的心得,那就來分享一下吧.......
※ 引述《cyclone350 (老子我最神)》之銘言
: 純抱怨
: PM 提了一個打折需求,我需要知道若商品打折後有小數點是如何進位
: 1. 四捨五入 2. 無條件進位 3. 無條件捨去
: 以下是我們對話 (我簡稱為 XXX)
: XXX: 請問商品打折後如果不是整數的話要怎麼進位?
: 如果你沒想法的話,我建議無條件捨去
: PM1: 為什麼商品打折後不會是整數? 應該都要是整數阿
在某些編譯器及語言中,
如果一開始儲存的變數是以整數宣告的,沒有經過特殊處理或是指定時,經過小數計算
之後仍然會以整數為儲存數值
舉例而言:
c語言為例
float aa=2.4;
float bb=2.6;
int a=aa*10
int b=bb*10
此時結果的a會是24,而b則會是25
至於為什麼會有這種結果,
原因在於float bb儲存的值實際上趨近2.5999999,取整數時25.999會被直接捨去小數點
變成25
這些例子有很多,但是對於系統上數量一多起來差異其實非常大,不能不小心
曾經有顆火箭就是這原因栽掉的......
另外就是重要的結論,float跟double在部分數值上表現時都是近似值,不是真正的數值
...避免這問題就要從浮點數本身儲存格式注意,避免掉非二進制小數點形成的問題
回到這個問題本身,
如果我單純原本儲存的就是整數,不管怎麼算這個東西會自動幫忙存成整數.....像是上
面就這樣....
: XXX: 甚麼?
: XXX: 為什麼是 80 元?
: PM1: 不是,應該是 20 元吧?
: PM2: XXX,到底是 80 元還是 20 元啊?
: XXX: 啥? 打折是甚麼意思之前沒有共識嗎?
: PM2: 當初的結論是甚麼?
: XXX: (講一下打折是甚麼意思)
: PM1: 不對阿,那這樣我要賣 20 元,我打八折後不是 20 元,我要怎麼賣?
: XXX: 你可以定價設 20 元
: PM1: 是這樣嗎? 會不會我賣 20 元後打八折就不是賣 20 元
: XXX: ...?
: PM1: 這樣 20 元的商品打八折後就變 16 元,不是 20元
: XXX: 對阿,然後?
: PM1: 可是我要賣 20 元阿
: XXX: 那你就不要設定打折阿
: PM1: 那我要打折又要賣 20 元的話怎麼辦
: XXX: (無視) 既然大家都知道打折的意義,
: 那現在可以讓我知道 39 元的商品打八折要賣幾元嗎?
其實真正從從商業角度上來看,「打折」並不是這麼簡單的。打折不是單單以「單價多
少,售價打折就是多少」的直觀概念去設計,反而更會以「我打算賣多少錢,那那個商
品的售價就是多少錢」才對,
舉例而言,
我想賣一個進價成本為50元的商品售價為90元(利潤要40元),銷售策略上必須要使定
價打完八折為90元為標示,也就是說我固定某個利潤或是售價,另外計算打折前的定價
,這樣比較符合某些銷售策略,
也就是X*0.8=90,此時的X就是目標定價
最後的結果會是X=0.8/9.........
更長遠的設計,從進價成本去做獲利運算,目標利潤設在30%時,假設進價是in 售價是
out
1.3*in=0.8*out
上面就是基本的售價模型,
更進一步設計,裡面的1.3的0.3跟8折的0.8是可以使用者自己設定的,這樣才是一個面
向客戶導向設計的一個模型,不是單單用「啊我打八折就是原本多少打八折就好了呀」
,因為商業中只會有成本、售價跟利潤是最終計算結果,定價最多是短暫的、不穩定的
一個參考值而已....
: PM2: 這問題很複雜,上次我去飲料店點了一杯紅茶,你知道怎麼樣嗎?
: XXX: 不知道
: PM2: 我跟他說我要加珍珠,他要多收我 5 元
: XXX: 然後?
更深的探討,加值服務或是類似遊戲的DLC這種東西,都有它一定的意義跟計算方式,
我猜想,像是Steam平台那樣,可以一款遊戲打八折,一款遊戲加補充包打七折仍然能穩
定獲得可觀利潤.....
珍珠奶茶的珍珠成本3塊錢,但是另外加5元的珍珠量的成本可能是4塊,椰果是4塊5...
PM可能沒想這麼遠啦,但是今天我重新想了一次這兩個小問題,感覺有更深的意義....
畢竟客戶的需求,往往不是這麼簡單,不是嗎?