測試給我提了個BUG,我發現是開源框架產生的

2021-10-08 04:21:33 字數 1775 閱讀 8160

公司有個財務管理的專案,我負責核心的計算模組。

因為財務管理有很多公式,不僅僅是加減乘除,所以引用了很多數學公式。如max,min,if,and,or,round等等。

例如:

#平均日工資# = (#基礎工資#+#工齡補貼#+#職稱補貼#+#績效工資#)/21.75
#職業技能補貼# = if(#專業技術#=\"初級\",40,if(#專業技術#=\"中級\",70,if(#專業技術#=\"高階\",100,0)))
一般的加減乘除,還是很容易實現的,但是像上面的公式,基本上處理起來的就比較棘手了。

為啥我會想到用apache-poi呢?

最開始我參加工作的時候,在一家金融公司,報表特別多,所以使用過apache-poi解析過excel檔案。

這時候,我想它既然支援解析excel,那肯定支援解析公式啊。不過像#基礎工資#可不能直接解析,那就將公式裡每一項都計算出來,然後再帶入到#平均日工資# =(#基礎工資#+#工齡補貼#+#職稱補貼#+#績效工資#)/21.75,2

例如:#平均日工資#=(10000+100+500+1000)/21.75,2

這樣不就得到平均日工資了嘛,我為自己的智慧型深深地折服。

另外,jep也可以做複雜公式的計算,不過用起來很雞肋,尤其計算用浮點數竟然用double,精度丟失啊兄弟們有木有。

我在設計模式-直譯器模式這一篇部落格裡,提及過jep,有興趣的可以去看下

這個專案靠著我的設計穩定執行,財務是不容許出現小錯誤的。

可是在前天,測試告訴我。平均日工資在使用round函式,保留兩位小數時,出現了小小的問題。就是平均日工資為整數時,只保留了1位。如下圖:

把說它是個bug或者問題,其實也不算,因為計算的數值是正常的;只是整數保留小數點後幾位,效果都一樣。

例如:3088.00 , 3088.0和3088都是等價的,並且round函式在excel使用時,也無法保留整數的小數字。

抱著治學嚴謹的態度,我開啟之前寫的**,一頓debug後,發現這個鍋是apache-poi框架的,他們對整數處理時,往後面加了個.0

,例如:round(3088.00,2),它會將3088.00轉化為3088.0,也會將3088.000轉化為3088.0,導致了round函式的精確值並不準確。

我也在excel做了對比試驗,在excel中使用

round(3088,2)round(3088.0,2)以及round(3088.000,2)

得到的結果都是3088,這和我們使用apache-poi又不太一樣。

於是,我就像給他們這個框架提issue,我來到github上,找到開源專案apache-poi。難受的是,這個開源框架沒開issue。wtf,什麼操作~!!

然鵝,沒有人理我。

那麼問題來了,apache-poi這個框架github上不給提issue,

stack overflow也沒人管,那麼它到底有沒有開源精神~~

另外,我還發現它另乙個bug,等下次更新出來分享給大家,不過看這情況,怕是都要我自己動手解決咯。

給我個世界,讓我放個屁

如果你說幹嗎讓這篇文章的題目這樣髒稀稀的呢?你錯了,它是內心深處的獨白,不是髒稀稀的表文 當四周寂靜的如同漆黑的原野,當內心寂寞的所有的美麗的哀怨都湧上了心頭,開啟 聽著美麗但讓人哀傷的歌 正題 說,工作也有了,也有了固定的小額度的收入,愛情也在遠方時常的被你呵護著並關心著你,你為啥這樣悲悽的 裡的...

給我個春天,我就跟你走。。 上

給我乙個春天,我就跟你走 一 12月25日,聖誕節的晚上11點。我背了乙個小包,裝著我的幾本書在街上流浪。剛剛,一場戰爭,我出走了。我不是乙個叛逆的孩子,在所有別的人認為是叛逆階段的時候,我都很乖,可是,就在所有人都認為應該懂事應該明白的時候我卻突然叛逆起來。還有幾個沒有關門的飯店,聖誕樹和彩燈從玻...

記錄折磨我的第1個bug

這是income.vue頁面的正規表示式部分 for var i 0 i that.arr.length i else if that.arr i type else that.max that.momo 0 that.b that.arr i create time this.moment.loc...