From 7540f407937eac25d13362866405c4b36e04fe41 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期日, 20 九月 2026 09:08:34 +0800
Subject: [PATCH] refactor(汇总表): 数值全精度写入 + 单元格格式统一两位小数显示
---
docs/工作日结/工作日结_2026-09-20.md | 64 ++++++++++++
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/WycSplitCalc.java | 9 -
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | 140 +++++++++++++++-------------
docs/功能测试报告/功能测试报告_全精度存储与两位小数显示_2026-09-20.md | 86 +++++++++++++++++
4 files changed, 228 insertions(+), 71 deletions(-)
diff --git "a/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\345\205\250\347\262\276\345\272\246\345\255\230\345\202\250\344\270\216\344\270\244\344\275\215\345\260\217\346\225\260\346\230\276\347\244\272_2026-09-20.md" "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\345\205\250\347\262\276\345\272\246\345\255\230\345\202\250\344\270\216\344\270\244\344\275\215\345\260\217\346\225\260\346\230\276\347\244\272_2026-09-20.md"
new file mode 100644
index 0000000..ec18ab4
--- /dev/null
+++ "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\345\205\250\347\262\276\345\272\246\345\255\230\345\202\250\344\270\216\344\270\244\344\275\215\345\260\217\346\225\260\346\230\276\347\244\272_2026-09-20.md"
@@ -0,0 +1,86 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡_鍏ㄧ簿搴﹀瓨鍌ㄤ笌涓や綅灏忔暟鏄剧ず_2026-09-20
+
+## 涓�銆佸姛鑳借鏄�
+
+**闇�姹傦紙鐢ㄦ埛 2026-09-20 鎸囦护锛�**锛氭墍鏈夌殑鏁版嵁閮藉叏閮ㄥ叏绮惧害淇濈暀锛岃绠楀緱鍒扮殑缁撴灉鏄剧ず涓や綅灏忔暟銆�
+
+**鏀瑰墠闂**锛�
+
+1. 鍚庣鍦�**鍐欏崟鍏冩牸涔嬪墠**灏卞仛浜嗗洓鑸嶄簲鍏ワ紝搴曞眰瀛樺偍鍊艰鎻愬墠鎴柇锛�
+ - `round(v, 4)`锛氳揣杩愯涓�/瑙勪笅/鍚屾瘮銆佺疮璁′笌褰撴湀銆佷腑鍙e緞鎺掑悕/鍒嗘瀽銆乣梅10000` 鍗曚綅鎹㈢畻銆佹姇璧勮繘搴︺�佺墿娴佸崰姣斻�佹姇璧勮鍒掍竾鍚紱
+ - `round(v, 2)`锛氶�氱敤鏁版嵁鏍� `setDataCell`銆佸钩鍧囪繍璺濆厹搴曘�佸杩愯浆杩愬啓鍏ワ紱
+ - `round(v, 1)`锛氭帓鍚嶉〉鍗犳瘮锛坄setFreightShare`銆佽揣杩愰噺鎺掑悕/鍛ㄨ浆閲忔帓鍚嶅潡锛夈��
+ 璇樊铏藉皬锛屼絾灞炰簬銆岃绠楀彛寰勮鍐欐銆嶏紝涓庝汉宸ョ敤鍏ㄧ簿搴﹂噸绠楃殑缁撴灉澶╃劧瀵逛笉涓婏紙姝f槸 09-19 涓彛寰勫樊寮傞棶棰樼殑鍚屾簮椋庨櫓锛夈��
+2. 姣嶇増涓埆鏍艰嚜甯� 3~4 浣嶅皬鏁�**鏄剧ず鏍煎紡**锛坄0.0000_);[Red]\(0.0000\)`銆乣0.000_ `锛夛紝灞曠ず浣嶆暟涓嶇粺涓�銆�
+
+**鏀瑰悗瀹炵幇**锛�
+
+1. **鍏ㄧ簿搴�**锛氬彇娑堟墍鏈夊啓鍏�/杩愮畻鍓嶇殑棰勮垗鍏ワ紝鏁板�间互 `double` 鍘熷�煎弬涓庤繍绠楀苟鍐欏叆锛沗/10000`銆佸崰姣斻�佸悓姣斻�佸钩鍧囪繍璺濆厹搴曠瓑涓�寰嬩笉鎴柇銆�
+2. **涓や綅灏忔暟灞曠ず**锛氱敱鍗曞厓鏍兼暟瀛楁牸寮忔壙鎷呫�傞噸鍐� `applyTwoDecimalFormat()`锛�
+ - 鏁板�兼牸鏍煎紡缁熶竴涓� `0.00`锛坄cloneStyleFrom` 淇濈暀杈规/瀛椾綋/瀵归綈锛屽彧鎹㈡暟瀛楁牸寮忥紝`;[Red]\(...\)` 绛夊墠鍚庣紑鍘熸牱淇濈暀锛夛紱
+ - **3 浣嶅強浠ヤ笂灏忔暟鐨勬牸寮�**锛坄0.000_ `銆乣0.0000_);[Red]\(0.0000\)`锛夌敤姝e垯 `\.0{3,}` 鏀舵暃涓� `.00`锛�
+ - 鐧惧垎姣旓紙`%`锛夈�佺瀛﹁鏁帮紙`E`锛夈�佹枃鏈紙`@`锛夈�佹棩鏈熸牸寮�**涓嶅姩**锛�
+ - 鏁存暟鍊兼牸娌跨敤鏃㈡湁绾﹀畾涓嶆樉绀� `.00`锛堝骞翠唤銆佹帓鍚嶏級銆�
+3. 鎺у埗鍙�/鎺ュ彛杩斿洖鐨�**棰勮鎽樿**閲岀殑 `round`锛坄addSum(...)`锛変繚鐣欙紝瀹冧笉杩涙姤琛ㄦ暟鎹��
+
+**鏀瑰姩鏂囦欢**锛�
+
+| 鏂囦欢 | 鏀瑰姩 |
+| --- | --- |
+| `traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java` | 鍘婚櫎 40 澶勯鑸嶅叆锛涢噸鍐� `applyTwoDecimalFormat()`锛堟柊澧� `DEC_MORE_THAN_TWO` 姝e垯甯搁噺锛� |
+| `traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/WycSplitCalc.java` | 骞冲潎杩愯窛鍏滃簳鏀瑰叏绮惧害锛涘垹闄ゅ凡鏃犲紩鐢ㄧ殑绉佹湁 `round(double,int)` |
+
+## 浜屻�佹祴璇曠幆澧�
+
+| 椤� | 鍐呭 |
+| --- | --- |
+| 鍚庣 | Spring Boot `localhost:8090`锛宍mvn -q -o compile` 閫氳繃鍚庣敱 `start-dev.ps1` 閲嶅惎锛圥ID 15568锛� |
+| 鍓嶇 | Vue `localhost:8080`锛圥ID 28608锛夛紝涓庡悗绔竴骞堕噸鍚� |
+| 鏁版嵁搴� | MySQL `localhost:3308/traffic_audit` |
+| 鎶ヨ〃鏈� | 2026-08锛�1-8 鏈堢疮璁″潡 + 8 鏈堝崟鏈堝潡锛� |
+| 瀵圭収浠� | 鏀瑰墠鐢熸垚浠� `_after_busfix_2026-08.xlsx`锛�09-19 鍙e緞淇鍚庛�佹湰娆℃敼閫犲墠锛� |
+| 鏀瑰悗鐢熸垚浠� | `_after_precision_2026-08.xlsx`銆乣_after_precision_midrank/midana/middetail.xlsx`锛屼互鍙� `_out_precision\` 涓� 22 涓帴鍙d骇鐗� |
+| 鍙栬瘉鑴氭湰 | `_qa_prec_*.py`銆乣_regen_precision.ps1`銆乣_regen_all.ps1` |
+
+## 涓夈�佺敤渚嬩笌缁撴灉
+
+| 缂栧彿 | 绫诲瀷 | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+| --- | --- | --- | --- | --- | --- |
+| T1 | 姝e悜 | `mvn -q -o compile` | 缂栬瘧閫氳繃 | exit=0锛屾棤鍛婅 | 閫氳繃 |
+| T2 | 姝e悜 | 22 涓鍑烘帴鍙o紙period=2026-08锛� | 鍏ㄩ儴 200 涓旈潪绌� | 21 涓� OK锛沗wycSplit` 500锛堢己杈撳叆鏂囦欢锛岃銆屽洓-5銆嶏級 | 閫氳繃 |
+| T3 | 姝e悜 | 鏀瑰墠/鏀瑰悗銆婇亾璺繍杈撻噺姹囨�昏〃銆嬮�愭牸鏁板�煎姣旓紙66205 涓叡鏈夋暟鍊兼牸锛� | 浠呯洰鏍囨牸鍑虹幇宸紓 | 瀹為檯鍙樺寲 **249 鏍�**锛屽叏閮ㄨ惤鍦ㄣ�岃揣杩愰噺鎺掑悕銆�107 +銆屼腑鍙e緞鎺掑悕銆�142 | 閫氳繃 |
+| T4 | 姝e悜 | 鏈�澶у彉鍖栭噺 | 鍙簲鏄幓鎺夎垗鍏ュ甫鏉ョ殑灏炬暟宸� | **0.00022 涓囦汉鍏噷**锛�=2 浜哄叕閲岋級锛屼綅缃�屼腑鍙e緞鎺掑悕銆嶅叏鐪佽 O3 | 閫氳繃 |
+| T5 | 姝e悜 | 姝︽眽绱鍛ㄨ浆閲� | 鍏ㄧ簿搴︿繚鐣欙紝4 浣嶅皬鏁颁綅浠嶄负 8912 | 涓彛寰勬槑缁� S104 = 152330.89119999998锛涙帓鍚嶉〉 O4 / 閬撹矾杩愯緭鍛ㄨ浆閲� Q5 = 152330.8912 | 閫氳繃 |
+| T6 | 姝e悜 | 瀛濇劅绱鍛ㄨ浆閲� | 涓嶅啀鎴柇鍒� 64429.9445 | 64429.944543113306锛堟帓鍚嶉〉涓庢槑缁嗛〉閫愪綅涓�鑷达級 | 閫氳繃 |
+| T7 | 姝e悜 | 銆屼腑鍙e緞鎺掑悕銆嶆敼鍓�/鏀瑰悗鎸変袱浣嶅皬鏁板姣� | 瀹屽叏涓�鑷达紙涓嶅簲鏀瑰彉鍙缁撴灉锛� | 涓嶄竴鑷存牸 **0** | 閫氳繃 |
+| T8 | 姝e悜 | 鍏ㄧ渷琛� `=SUM(O4:O20)` 闂悎 | 缂撳瓨鍊� = 17 甯傚窞鍏ㄧ簿搴︽眰鍜� | 1227147.4890200002锛�**宸� 0.0**锛�09-19 鐨� 0.0002 娈嬬暀宸叉秷闄わ級 | 閫氳繃 |
+| T9 | 姝e悜 | 姹囨�诲ぇ琛ㄣ�屾湁鍊兼暟鍊�/鍏紡鏍笺�嶇殑 3 浣嶄互涓婂皬鏁版牸寮� | 0 鏍� | 鏀瑰墠 108 鏍� 鈫� 鏀瑰悗 **0 鏍�** | 閫氳繃 |
+| T10 | 姝e悜 | 涓彛寰勬槑缁嗭紙鐙珛浠讹級`0.000_ ` 鏍煎紡鏍� | 鏀舵暃涓轰袱浣� | 鏀瑰墠 134 鏍� 鈫� 鏀瑰悗 **0 鏍�**锛汣19 鍊� 13.599765541547498 涓嶅彉锛屾牸寮忓彉 `0.00_ ` | 閫氳繃 |
+| T11 | 姝e悜 | 22 涓骇鐗╃殑 3 浣嶄互涓婂皬鏁版牸寮忔眹鎬� | 鍏ㄤ负 0 | 15 涓彲瑙f瀽浜х墿鍚堣 **0 鏍�** | 閫氳繃 |
+| T12 | 鍥炲綊 | 琛ㄥ唴閿欒鍊硷紙`#DIV/0!`/`#VALUE!`/`#REF!`锛夋暟閲� | 涓嶆柊澧� | 鏀瑰墠 589 = 鏀瑰悗 589锛堝垎甯冮�愰」鐩稿悓锛� | 閫氳繃 |
+| T13 | 鍥炲綊 | 鐧惧垎姣旀牸 / 涓や綅灏忔暟鏍兼暟閲� | 涓嶅彈褰卞搷 | 25665 / 39552锛屼笌鏀瑰墠涓�鑷� | 閫氳繃 |
+| T14 | 鍥炲綊 | 鐙珛浠� `passengerMidRank`銆乣passengerMidAnalysis` | 鏃� 3 浣嶄互涓婂皬鏁版牸寮� | 0 鏍硷紙鏀瑰墠鏈氨 0锛� | 閫氳繃 |
+| T15 | 杈圭晫 | 绌哄�兼牸銆佹枃鏈牸锛堝鏈堜唤鏂囨湰銆�2023骞�4鏈堛�嶏級 | 涓嶅姩 | 浠嶅甫 4 浣嶅皬鏁版牸寮� 274 鏍硷紙260 绌哄�� + 14 鏂囨湰锛夛紝鏃犳樉绀哄�硷紝涓嶅鐞� | 閫氳繃 |
+| T16 | 杈圭晫 | 鏁存暟鍊兼牸锛堝勾浠�/鎺掑悕锛� | 涓嶆樉绀� `.00` | 娌跨敤鏃㈡湁銆屾暣鏁颁笉鏄剧ず .00銆嶄繚鎶わ紝鏈鏈鏀瑰姩鐮村潖 | 閫氳繃 |
+| T17 | 杈圭晫 | 涓� `round(鏀瑰悗,4)` 涓嶄竴鑷寸殑 30 鏍� | 灞炰簩闃堕噸绠楄�岄潪閿欒 | 鍚屾瘮鍒楃敱鍏ㄧ簿搴﹀垎瀛愬垎姣嶉噸绠楋紝閲忕骇 1e-9~1e-8锛堝 0.0712378390 鈫� 0.0712378363锛� | 閫氳繃 |
+| T18 | 璐熷悜 | 姣嶇増鎺掑悕椤� Q 鍒楀叕寮� `=ROUND(B/L*10,1)` | 鏈涓嶆敼姣嶇増 | 浠嶄繚鐣欙紙36脳2 鏍硷級锛孍xcel 鎵撳紑浼氭寜鍏紡閲嶇畻鍒� 1 浣嶅悗鍐嶆寜 `0.00` 灞曠ず | 瑙併�屽洓-4銆嶅緟鎷嶆澘 |
+
+## 鍥涖�佸彂鐜扮殑闂涓庡缃�
+
+1. **姣嶇増甯� 4 浣嶅皬鏁版牸寮忕殑鏈夊�兼牸 108 涓�**锛坄璐ц繍!EO90/EO93/EO108/EO111` 绛� SUM 鍏紡鏍笺�乣鍏矾鎬诲杩�!DE2` 绛夛級鈫� 宸茬敱鏍煎紡褰掍竴澶勭悊涓� `0.00`锛涘墿浣欏甫璇ユ牸寮忕殑 274 鏍煎潎涓虹┖鍊�/鏂囨湰鏍硷紝鏃犳樉绀哄�笺��
+2. **銆屾暣鏁颁笉鏄剧ず .00銆嶄繚鎶ゅ厛鎶婂叕寮忔牸璺宠繃浜�**锛氶杞敼閫犲悗 `璐ц繍!EO90/EO93/EO108/EO111` 浠嶆槸 `0.0000`锛堢紦瀛樺�间负 0锛岃鍒ゅ畾涓烘暣鏁拌�岃烦杩囷級銆傚凡鎶娿��3 浣嶄互涓婂皬鏁版牸寮忓綊涓�銆嶇殑鍒ゆ柇**鎻愬埌鏁存暟淇濇姢涔嬪墠**鈥斺�旇繖绫绘牸鏈潵灏辫蛋鏁板�兼牸寮忓睍绀猴紝涓庛�孏eneral 鐨勬暣鏁板�间笉鏄剧ず .00銆嶄笉鍐茬獊銆�
+3. **3 浣嶅皬鏁版牸寮忔湭琚瘑鍒�**锛坄0.000_ `锛夛細鍘熷垽鏂敤 `f.contains("0.00")` 璁や负宸叉槸涓や綅锛岃�� `0.000_ ` 鎭板ソ鍖呭惈瀛愪覆 `0.00` 鑰岃璺宠繃锛屽鑷翠腑鍙e緞鏄庣粏 134 鏍兼紡鏀广�傚凡鏀逛负姝e垯 `\.0{3,}` 缁熶竴鏀舵暃銆�
+4. **姣嶇増鎺掑悕椤� Q 鍒椾粛鏄� `=ROUND(B/L*10,1)`**锛堣揣杩愰噺鎺掑悕 Q4:Q42銆佽揣杩愬懆杞噺鎺掑悕 Q5:Q44锛屽叡 72 鏍硷級锛�
+ 绋嬪簭瀵瑰叕寮忔牸涓�寰嬩笉瑕嗗啓锛堜繚鐣欐瘝鐗堝叕寮忚璁★級锛孍xcel/WPS 鎵撳紑鏃朵細鎸夊叕寮忛噸绠楀洖 1 浣嶅皬鏁板啀浠� `0.00` 鏍煎紡灞曠ず銆�
+ 鑻ヨ杩炶繖 72 鏍间篃鍏ㄧ簿搴︼紝闇�瑕佹妸涓変釜姣嶇増鐨勫叕寮忔敼鎴� `=B/L*10`锛堝苟鍚屾 R 鍒� `=10-Q`锛夆�斺��**寰呯敤鎴风‘璁ゅ悗鍐嶅姩姣嶇増**銆�
+5. **`wycSplit` 鎺ュ彛 500**锛歚loadWycMonthlyInput()` 鎶涖�屾湭鎵惧埌缃戠粶绾﹁溅锛堝叏鐪侊級姹囨��.xlsx锛岃鏀惧埌 docs/缃戠粶瀹㈣繍 鐩綍銆嶏紝鑰� `docs\缃戠粶瀹㈣繍` 鐩綍褰撳墠涓嶅瓨鍦ㄢ�斺�斿睘**缂鸿緭鍏ユ暟鎹殑鏃㈡湁鐜拌薄**锛屼笌鏈鏀归�犳棤鍏炽��
+
+## 浜斻�佺粨璁�
+
+- 鎶ヨ〃鏁板�煎凡鍏ㄩ儴鏀逛负**鍏ㄧ簿搴﹀啓鍏�/杩愮畻**锛屽睍绀轰綅鏁扮粺涓�鐢卞崟鍏冩牸鏍煎紡鎵挎媴锛堜袱浣嶅皬鏁帮紱鐧惧垎姣斻�佹棩鏈熴�佹枃鏈牸寮忎笉鍙橈級銆�
+- 閫愭牸瀵规瘮璇佸疄锛氭敼鍚庝笌鏀瑰墠鐨勫彲瑙佺粨鏋滐紙涓や綅灏忔暟鍙e緞锛�**瀹屽叏涓�鑷�**锛屽樊寮備粎鍑虹幇鍦ㄨ鍘绘帀鑸嶅叆鐨勫熬鏁颁綅锛屾渶澶� 0.00022 涓囦汉鍏噷銆�
+- 椤哄甫娑堥櫎浜� 09-19 閬楃暀鐨勩�屽叏鐪佽 0.0002 涓囦汉鍏噷銆嶏細鍚勫競宸炴敼涓哄叏绮惧害鍚庯紝姣嶇増鍏紡 `=SUM(O4:O20)` 涓庢槑缁嗗叏绮惧害姹傚拰**閫愪綅闂悎**銆�
+- 22 涓鍑烘帴鍙e洖褰掗�氳繃锛坄wycSplit` 涓烘棦鏈夌己鏁版嵁闂锛夛紱閿欒鍊兼暟閲忋�佺櫨鍒嗘瘮鏍兼暟閲忓潎鏃犲彉鍖栥��
+- 閬楃暀涓�椤瑰緟鎷嶆澘锛氭瘝鐗堟帓鍚嶉〉 Q/R 鍗犳瘮鍏紡鐨� `ROUND(...,1)`銆�
+
+娴嬭瘯浜猴細Codex锛圓I锛夈��娴嬭瘯鏃ユ湡锛�2026-09-20
diff --git "a/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-20.md" "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-20.md"
new file mode 100644
index 0000000..72a2f74
--- /dev/null
+++ "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-20.md"
@@ -0,0 +1,64 @@
+# 宸ヤ綔鏃ョ粨_2026-09-20
+
+## 涓�銆佷粖澶╁仛浜嗕粈涔�
+
+### 1. 鍥炵瓟鐢ㄦ埛鏍稿宸紓鐨勭枒闂紙鎵挎帴 09-19锛�
+
+鐢ㄦ埛鎶婁汉宸ョ畻鐨勪竴鍒楁斁杩涙闈€�婄敓鎴恄閬撹矾杩愯緭閲忔眹鎬昏〃 (1).xlsx銆嬶紝闂樊寮傚師鍥犮��
+鐢ㄦ埛杩介棶銆屾槸涓嶆槸鍙栨暟缁村害涓嶅閫犳垚鐨勨�斺�旂▼搴忕洿鎺ュ姞銆庡煄闄呭煄涔°�忥紝浜哄伐鐢ㄣ�庢�婚噺鈭掑煄甯傚唴銆忋�嶁�斺��
+**鏄殑锛屾鏄繖涓師鍥�**锛屽凡鍦� 09-19 淇骞舵帹閫侊紙闂璁颁簬銆婂姛鑳芥祴璇曟姤鍛奯涓彛寰勬帓鍚嶅懆杞噺鍙e緞缁熶竴_2026-09-19.md銆嬶級銆�
+
+### 2. 鍏ㄧ簿搴﹀瓨鍌� + 涓や綅灏忔暟鏄剧ず鏀归�狅紙浠婂ぉ涓讳换鍔★級
+
+**鐢ㄦ埛鎸囦护**锛氥�屾墍鏈夌殑鏁版嵁閮藉叏閮ㄥ叏绮惧害淇濈暀锛岃绠楀緱鍒扮殑缁撴灉鏄剧ず涓や綅灏忔暟銆傘��
+
+- **鍘婚鑸嶅叆**锛歚ReportExportService.java` 鍘绘帀 40 澶勫啓鍏ュ墠鐨� `round(...)`鈥斺��
+ 璐ц繍瑙勪笂/瑙勪笅/鍚屾瘮锛堢疮璁′笌褰撴湀锛夈�乣梅10000` 鍗曚綅鎹㈢畻锛堢渷/甯� 脳 鏈�/绱鍥涘锛夈��
+ 涓彛寰勬帓鍚�/鍒嗘瀽鍐欏叆銆佹帓鍚嶉〉鍗犳瘮锛坄setFreightShare`銆佽揣杩愰噺鎺掑悕/鍛ㄨ浆閲忔帓鍚嶅潡锛夈��
+ 閫氱敤鏁版嵁鏍� `setDataCell`銆佸钩鍧囪繍璺濆厹搴曘�佸杩愯浆杩愬啓鍏ャ�佹姇璧勮繘搴︺�佺墿娴佸崰姣斻�佹姇璧勮鍒掍竾鍚紱
+ `WycSplitCalc.java` 骞冲潎杩愯窛鍏滃簳鏀瑰叏绮惧害骞跺垹闄ゅ凡鏃犲紩鐢ㄧ殑绉佹湁 `round`銆�
+- **灞曠ず浣嶆暟浜ょ粰鍗曞厓鏍兼牸寮�**锛氶噸鍐� `applyTwoDecimalFormat()`
+ 鈥斺�旀暟鍊兼牸缁熶竴 `0.00`锛堜繚鐣� `;[Red]\(...\)` 绛夊墠鍚庣紑锛夛紝**3 浣嶅強浠ヤ笂灏忔暟鐨勬牸寮�**锛坄0.000_ `銆乣0.0000`锛�
+ 鐢ㄦ鍒� `\.0{3,}` 鏀舵暃涓轰袱浣嶏紱鐧惧垎姣�/鏃ユ湡/绉戝璁℃暟/鏂囨湰鏍煎紡涓嶅姩锛涙暣鏁板�兼部鐢ㄣ�屼笉鏄剧ず .00銆嶇害瀹氥��
+- 鎺у埗鍙伴瑙堟憳瑕侀噷鐨� `round` 淇濈暀锛堜笉杩涙姤琛ㄦ暟鎹級銆�
+
+**杩囩▼涓慨鎺夌殑涓や釜鑷綔鑱槑鐨勫潙**锛堝潎宸插湪娴嬭瘯鎶ュ憡銆屽洓銆佸彂鐜扮殑闂涓庡缃�嶇暀璇侊級锛�
+
+1. 銆屾暣鏁颁笉鏄剧ず .00銆嶇殑淇濇姢鍏堟妸鍏紡鏍艰烦杩囦簡锛岄杞敼閫犲悗 `璐ц繍!EO90/EO93/EO108/EO111`
+ 浠嶆槸 `0.0000`锛堢紦瀛樺�� 0 琚垽涓烘暣鏁帮級鈫� 鎶婃牸寮忓綊涓�鍒ゆ柇**鎻愬埌鏁存暟淇濇姢涔嬪墠**銆�
+2. 鏃у垽鏂� `f.contains("0.00")` 鎶� `0.000_ ` 璇垽涓恒�屽凡鏄袱浣嶅皬鏁般�嶏紝涓彛寰勬槑缁� 134 鏍兼紡鏀�
+ 鈫� 鏀规鍒欏悗褰掗浂銆�
+
+## 浜屻�佹祴璇曠粨鏋滄憳瑕�
+
+瑙併�婂姛鑳芥祴璇曟姤鍛奯鍏ㄧ簿搴﹀瓨鍌ㄤ笌涓や綅灏忔暟鏄剧ず_2026-09-20.md銆嬶細18 鏉$敤渚嬶紙11 姝e悜 / 4 鍥炲綊 / 3 杈圭晫 / 1 璐熷悜鎸傝捣锛夐�氳繃銆�
+
+- 缂栬瘧閫氳繃锛�22 涓鍑烘帴鍙e洖褰掞紝21 涓� OK锛坄wycSplit` 鍥犵己 `docs\缃戠粶瀹㈣繍` 杈撳叆鐩綍 500锛屽睘鏃㈡湁闂锛夈��
+- 鏀瑰墠 vs 鏀瑰悗銆婇亾璺繍杈撻噺姹囨�昏〃銆嬮�愭牸瀵规瘮 66205 涓暟鍊兼牸锛�**浠� 249 鏍煎彉鍖�**锛屾渶澶� 0.00022 涓囦汉鍏噷锛�
+ 涓や綅灏忔暟鍙e緞鐨勪笉涓�鑷存牸 **0**锛涢敊璇�兼暟閲� 589 鏃犲彉鍖栥��
+- 鍏抽敭鍊硷細姝︽眽绱鍛ㄨ浆閲� 152330.8912锛堝叏绮惧害 152330.89119999998锛夈�佸瓭鎰� 64429.944543113306 涓嶅啀琚埅鏂垚 64429.9445銆�
+- **09-19 閬楃暀鐨勩�屽叏鐪佽 0.0002 涓囦汉鍏噷銆嶅凡娑堥櫎**锛氬競宸炲叏绮惧害鍚庢瘝鐗� `=SUM(O4:O20)` 涓庢槑缁嗘眰鍜岄�愪綅闂悎锛堝樊 0.0锛夈��
+- 鏍煎紡锛氭湁鍊兼暟鍊�/鍏紡鏍间腑 3 浣嶄互涓婂皬鏁版牸寮� **108 鏍� 鈫� 0 鏍�**锛堟眹鎬诲ぇ琛級銆�**134 鏍� 鈫� 0 鏍�**锛堜腑鍙e緞鏄庣粏锛夛紝
+ 15 涓骇鐗╁悎璁� 0 鏍笺��
+
+## 涓夈�侀仐鐣欓棶棰樹笌寰呭姙
+
+1. **姣嶇増鎺掑悕椤� Q/R 鍗犳瘮鍏紡浠嶆槸 `=ROUND(B/L*10,1)`**锛堣揣杩愰噺鎺掑悕 Q4:Q42銆佽揣杩愬懆杞噺鎺掑悕 Q5:Q44锛屽叡 72 鏍硷級銆�
+ 绋嬪簭涓嶈鍐欏叕寮忔牸锛孍xcel 鎵撳紑浼氶噸绠楀洖 1 浣嶅啀鎸� `0.00` 灞曠ず銆傝嫢瑕佸交搴曞叏绮惧害锛岄渶鎶婁笁涓瘝鐗堟敼鎴� `=B/L*10`锛圧 鍒� `=10-Q`锛夆�斺��**寰呯敤鎴锋媿鏉�**銆�
+2. 浠嶅甫 4 浣嶅皬鏁版牸寮忕殑 274 鏍间负绌哄��/鏂囨湰鏍硷紙鏃犳樉绀哄�硷級锛屾湰娆′笉鍔紱鑻ュ悗缁鍦ㄨ繖浜涙牸濉暟鍐嶈瘎浼般��
+3. `wycSplit` 鎺ュ彛渚濊禆 `docs\缃戠粶瀹㈣繍\缃戠粶绾﹁溅锛堝叏鐪侊級姹囨��.xlsx`锛岃鐩綍褰撳墠涓嶅瓨鍦紝瀵煎嚭鎶� 500锛屽緟琛ヨ緭鍏ャ��
+4. 09-19 鐨勯仐鐣欓」锛堢敤鎴疯〃 O 鍒楅珮閫熻繍璺濆悓姣旀潵婧愩��545 瀹� vs 鍏ㄥ彛寰勪笂鎶ラ�夋嫨锛変粛鏈棴鐜��
+
+## 鍥涖�佹槑澶╄鍒�
+
+1. 鎸夌敤鎴峰弽棣堝喅瀹氭槸鍚﹁繛姣嶇増 Q/R 鍗犳瘮鍏紡涓�璧峰幓鎺� `ROUND(...,1)`銆�
+2. 鑻ョ敤鎴锋湁鍏朵粬琛ㄧ殑鏄剧ず浣嶆暟瑕佹眰锛屾寜鍚屼竴濂椼�屽叏绮惧害鍐欏叆 + 鏍煎紡鎺у埗灞曠ず銆嶈鍒欏鐞嗐��
+3. 琛ラ綈 `docs\缃戠粶瀹㈣繍` 杈撳叆鍚庡洖褰� `wycSplit` 瀵煎嚭銆�
+
+---
+
+**鏈鏀瑰姩鏂囦欢**
+
+- `traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java`
+- `traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/WycSplitCalc.java`
+- 鏂囨。锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_鍏ㄧ簿搴﹀瓨鍌ㄤ笌涓や綅灏忔暟鏄剧ず_2026-09-20.md`銆佹湰鏂囦欢
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/WycSplitCalc.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/WycSplitCalc.java
index 903f103..3ba16bd 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/WycSplitCalc.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/WycSplitCalc.java
@@ -190,8 +190,9 @@
if (r.getAvgDistanceCity() != null && r.getAvgDistanceCity() > 0) a[5] = r.getAvgDistanceCity();
}
for (double[] a : map.values()) {
- if (a[4] <= 0 && a[0] > 0) a[4] = round(a[1] / a[0], 2);
- if (a[5] <= 0 && a[2] > 0) a[5] = round(a[3] / a[2], 2);
+ // 骞冲潎杩愯窛鍏滃簳锛氬叏绮惧害淇濈暀锛屽睍绀轰綅鏁颁氦缁欏崟鍏冩牸鏍煎紡
+ if (a[4] <= 0 && a[0] > 0) a[4] = a[1] / a[0];
+ if (a[5] <= 0 && a[2] > 0) a[5] = a[3] / a[2];
}
return map;
}
@@ -317,8 +318,4 @@
private double nz(Double v) { return v == null ? 0.0 : v; }
- private double round(double v, int scale) {
- double factor = Math.pow(10, scale);
- return Math.round(v * factor) / factor;
- }
}
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
index 6673e20..b83bd0b 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -840,36 +840,36 @@
for (Double v : h2032FreightCum.values()) {
if (v != null) provAbove += v;
}
- Double provAboveWan = round(provAbove / 10000.0, 4);
+ Double provAboveWan = provAbove / 10000.0;
Double provTotal = freightCum(ftMap.get("婀栧寳鐪�"), month);
- Double provBelow = provTotal == null ? null : round(provTotal - provAboveWan, 4);
+ Double provBelow = provTotal == null ? null : provTotal - provAboveWan;
Double provTotalYoy = freightCumYoy(ftMap.get("婀栧寳鐪�"), month);
double provAboveLast = 0.0;
for (Double v : h2032FreightCumLast.values()) {
if (v != null) provAboveLast += v;
}
- Double provAboveYoy = provAboveLast == 0.0 ? null : round((provAbove - provAboveLast) / provAboveLast, 4);
+ Double provAboveYoy = provAboveLast == 0.0 ? null : (provAbove - provAboveLast) / provAboveLast;
Double provTotalLast = lastFreightCum(ftMap.get("婀栧寳鐪�"), month);
- Double provBelowLast = provTotalLast == null ? null : round(provTotalLast - provAboveLast / 10000.0, 4);
+ Double provBelowLast = provTotalLast == null ? null : provTotalLast - provAboveLast / 10000.0;
Double provBelowYoy = provBelowLast == null || provBelowLast == 0.0 ? null
- : round((provBelow - provBelowLast) / provBelowLast, 4);
+ : (provBelow - provBelowLast) / provBelowLast;
for (String city : RegionUtil.cityList()) {
Double a = h2032FreightCum.get(city);
- double aWan = a == null ? 0.0 : round(a / 10000.0, 4);
+ double aWan = a == null ? 0.0 : a / 10000.0;
Double t = freightCum(ftMap.get(city), month);
above.put(city, aWan);
total.put(city, t);
- below.put(city, t == null ? null : round(t - aWan, 4));
+ below.put(city, t == null ? null : t - aWan);
aboveYoy.put(city, h2032FreightYoy.get(city));
// 瑙勪笅鍚屾瘮 = (瑙勪笅浠婂勾 - 瑙勪笅鍘诲勾) / 瑙勪笅鍘诲勾锛涜涓嬪幓骞� = 妯℃澘鍘诲勾鍚堣 - H2032鍘诲勾瑙勪笂
Double tLast = lastFreightCum(ftMap.get(city), month);
Double aLast = h2032FreightCumLast.get(city);
- double aLastWan = aLast == null ? 0.0 : round(aLast / 10000.0, 4);
- Double belowLast = tLast == null ? null : round(tLast - aLastWan, 4);
+ double aLastWan = aLast == null ? 0.0 : aLast / 10000.0;
+ Double belowLast = tLast == null ? null : tLast - aLastWan;
Double b = below.get(city);
belowYoy.put(city, belowLast == null || belowLast == 0.0 || b == null
- ? null : round((b - belowLast) / belowLast, 4));
+ ? null : (b - belowLast) / belowLast);
totalYoy.put(city, freightCumYoy(ftMap.get(city), month));
}
@@ -894,20 +894,20 @@
if (maLast != null) provMonthAboveLast += maLast;
monthAbove.put(city, ma);
monthTotal.put(city, mt);
- monthBelow.put(city, mt == null ? null : round(mt - (ma == null ? 0.0 : ma), 4));
+ monthBelow.put(city, mt == null ? null : mt - (ma == null ? 0.0 : ma));
monthAboveYoy.put(city, growthYoy(ma, maLast));
Double mb = monthBelow.get(city);
- Double mbLast = mtLast == null ? null : round(mtLast - (maLast == null ? 0.0 : maLast), 4);
+ Double mbLast = mtLast == null ? null : mtLast - (maLast == null ? 0.0 : maLast);
monthBelowYoy.put(city, growthYoy(mb, mbLast));
monthTotalYoy.put(city, freightYoy(ftMap.get(city), month));
}
- Double provMonthAboveWan = provMonthAbove == 0.0 ? null : round(provMonthAbove, 4);
+ Double provMonthAboveWan = provMonthAbove == 0.0 ? null : provMonthAbove;
Double provMonthTotal = freightMonth(ftMap.get("婀栧寳鐪�"), month);
- Double provMonthBelow = provMonthTotal == null ? null : round(provMonthTotal - provMonthAbove, 4);
+ Double provMonthBelow = provMonthTotal == null ? null : provMonthTotal - provMonthAbove;
Double provMonthAboveYoy = growthYoy(provMonthAbove == 0.0 ? null : provMonthAbove, provMonthAboveLast);
Double provMonthTotalLast = lastFreightMonth(ftMap.get("婀栧寳鐪�"), month);
Double provMonthBelowLast = provMonthTotalLast == null ? null
- : round(provMonthTotalLast - provMonthAboveLast, 4);
+ : provMonthTotalLast - provMonthAboveLast;
Double provMonthBelowYoy = growthYoy(provMonthBelow, provMonthBelowLast);
Double provMonthTotalYoy = freightYoy(ftMap.get("婀栧寳鐪�"), month);
@@ -1244,7 +1244,7 @@
private Double monthFreightWan(Map<String, Map<Integer, Double>> byCityMonth, String city, int month) {
Map<Integer, Double> byMonth = byCityMonth == null ? null : byCityMonth.get(city);
Double v = byMonth == null ? null : byMonth.get(month);
- return v == null ? null : round(v / 10000.0, 4);
+ return v == null ? null : v / 10000.0;
}
/** 鍚屾瘮 = (鏈湡-鍩烘湡)/鍩烘湡锛涗换涓�鏈熺己澶辨垨鍩烘湡涓� 0 杩斿洖 null */
@@ -1346,12 +1346,12 @@
}
}
- /** 鍛ㄨ浆閲忔帓鍚� Q/R 鍗犳瘮锛氭ā鏉夸负缂撳瓨鍊硷紝鎸夋柊鏁版嵁閲嶇畻锛堣涓婂崰姣� 1 浣嶅皬鏁帮級 */
+ /** 鍛ㄨ浆閲忔帓鍚� Q/R 鍗犳瘮锛氭ā鏉夸负缂撳瓨鍊硷紝鎸夋柊鏁版嵁閲嶇畻锛堝叏绮惧害鍐欏叆锛屼袱浣嶅皬鏁板睍绀轰氦缁欏崟鍏冩牸鏍煎紡锛� */
private void setFreightShare(Row row, Double above, Double total) {
if (total != null && total > 0 && above != null) {
- double share = round(above * 10.0 / total, 1);
+ double share = above * 10.0 / total;
setFreightCell(row, 16, share);
- setFreightCell(row, 17, round(10.0 - share, 1));
+ setFreightCell(row, 17, 10.0 - share);
} else {
setFreightCell(row, 16, (Double) null);
setFreightCell(row, 17, (Double) null);
@@ -1561,9 +1561,9 @@
setNumeric(row, 15, isProvince ? null : yoyRankOfMap(totalYoy, city));
if (t != null && t > 0 && a != null) {
- double share = round(a * 10.0 / t, 1);
+ double share = a * 10.0 / t;
setNumeric(row, 16, share);
- setNumeric(row, 17, round(10.0 - share, 1));
+ setNumeric(row, 17, 10.0 - share);
}
return rowIdx + 1;
}
@@ -1604,9 +1604,9 @@
setNumeric(row, 15, isProvince || cum == null ? null : yoyRankOfTurnover(cumMap, city, 2));
if (total != null && total > 0 && above != null) {
- double share = round(above * 10.0 / total, 1);
+ double share = above * 10.0 / total;
setNumeric(row, 16, share);
- setNumeric(row, 17, round(10.0 - share, 1));
+ setNumeric(row, 17, 10.0 - share);
}
return rowIdx + 1;
}
@@ -1626,7 +1626,7 @@
Double v = byMonth == null ? null : byMonth.get(month);
if (v != null) sum += v;
}
- return round(sum / 10000.0, 4);
+ return sum / 10000.0;
}
Double total = freightMonth(ft, month);
Double above = getProvinceMonthValue(provinceMonthMap, ft, month, "freight", "above", h2032Freight);
@@ -1657,7 +1657,7 @@
for (Double v : h2032FreightCum.values()) {
if (v != null) sum += v;
}
- return round(sum / 10000.0, 4);
+ return sum / 10000.0;
}
Double total = freightCum(ft, monthCount);
Double above = getProvinceCumValue(provinceCum, ft, "freight", "above", h2032FreightCum, monthCount);
@@ -1687,7 +1687,7 @@
if ("above".equals(scale)) {
Map<Integer, Double> byMonth = h2032Freight.get(city);
Double v = byMonth == null ? null : byMonth.get(month);
- return v == null ? 0.0 : round(v / 10000.0, 4);
+ return v == null ? 0.0 : v / 10000.0;
}
Double total = freightMonth(ft, month);
Double above = getCityMonthValue(monthData, ft, city, month, "freight", "above", h2032Freight);
@@ -1716,7 +1716,7 @@
if ("total".equals(scale)) return freightCum(ft, monthCount);
if ("above".equals(scale)) {
Double v = h2032FreightCum.get(city);
- return v == null ? 0.0 : round(v / 10000.0, 4);
+ return v == null ? 0.0 : v / 10000.0;
}
Double total = freightCum(ft, monthCount);
Double above = getCityCumValue(cum, ft, "freight", "above", h2032FreightCum, city, monthCount);
@@ -1953,20 +1953,20 @@
double v = passengerMonthVal(data, indi, currentYear, m, region, metricIdx);
if (!keepFormula) {
if (c == null) c = row.createCell(col);
- if (v == 0.0) c.setBlank(); else c.setCellValue(round(v, 4));
+ if (v == 0.0) c.setBlank(); else c.setCellValue(v);
}
// 鍚屾瘮鍒楋細搴撳唴鍘诲勾鍚屾湀鍚屾瘮锛堟ā鏉� #REF! 鍏紡鏇挎崲涓烘暟鍊硷紝鍏紡琛屼篃瑕嗗啓锛�
double lv = passengerMonthVal(data, indi, currentYear - 1, m, region, metricIdx);
Cell yc = row.getCell(col + 1);
if (yc == null) yc = row.createCell(col + 1);
- if (v == 0.0 || lv == 0.0) yc.setBlank(); else yc.setCellValue(round((v - lv) / lv, 4));
+ if (v == 0.0 || lv == 0.0) yc.setBlank(); else yc.setCellValue((v - lv) / lv);
}
// 绱鍚屾瘮鍒楋紙妯℃澘 #REF! 鈫� 搴撳唴鍘诲勾 1..N 鏈堢疮璁″悓姣旀暟鍊硷級
int cumCol = extended ? 26 : 14;
Double cumYoy = passengerCumYoy(data, indi, currentYear, fillMonths, region, metricIdx);
Cell yc2 = row.getCell(cumCol + 1);
if (yc2 == null) yc2 = row.createCell(cumCol + 1);
- if (cumYoy == null) yc2.setBlank(); else yc2.setCellValue(round(cumYoy, 4));
+ if (cumYoy == null) yc2.setBlank(); else yc2.setCellValue(cumYoy);
}
recalc(wb);
return toBytes(wb);
@@ -2047,7 +2047,7 @@
private Double yoy(Double cur, Double base) {
if (cur == null || base == null || base == 0.0) return null;
- return round((cur - base) / base, 4);
+ return (cur - base) / base;
}
/** 鎸囨爣鍙栧�硷紙宸叉崲绠椾负涓囦汉/涓囦汉鍏噷/鍏噷锛涙棤鏁版嵁杩斿洖 null锛� */
@@ -2286,7 +2286,7 @@
if (v == 0.0) return; // 搴撳唴鏃犳簮锛氫繚鐣欐瘝鐗�/瀹氱鍘熷�硷紝缂烘暟鎹笉瑕嗙洊
// POI setCellValue(double) 瀵瑰叕寮忓崟鍏冩牸鍙洿鏂扮紦瀛樹笉绉婚櫎鍏紡锛屽繀椤诲厛 setBlank 鍐嶅啓鍊�
c.setBlank();
- c.setCellValue(round(v, 4));
+ c.setCellValue(v);
}
/** 鏄惧紡鍐欏叆 0锛圥OI setCellValue(0.0) 浼氳浆 blank锛岄渶鎿嶄綔搴曞眰 XML锛� */
@@ -2582,12 +2582,12 @@
int monthCount = (y == currentYear) ? maxMonth : 12;
for (int m = 1; m <= monthCount; m++) {
Double cur = midMetricValue(aggOf(data, y, m, region), i, volume);
- setNumeric(row, col++, cur == null ? null : round(cur, 4));
+ setNumeric(row, col++, cur);
Double base = midMetricValue(aggOf(data, y - 1, m, region), i, volume);
setNumeric(row, col++, yoy(cur, base));
}
Double cum = midCumOf(data, y, region, monthCount, i, volume);
- setNumeric(row, col++, cum == null ? null : round(cum, 4));
+ setNumeric(row, col++, cum);
Double cumBase = midCumOf(data, y - 1, region, monthCount, i, volume);
setNumeric(row, col++, yoy(cum, cumBase));
}
@@ -2670,18 +2670,18 @@
double turn = midCumClass(mid, currentYear, city, maxMonth, 0, false);
double lastPass = midCumClass(mid, currentYear - 1, city, maxMonth, 0, true);
double lastTurn = midCumClass(mid, currentYear - 1, city, maxMonth, 0, false);
- setValOrBlank(sheet, r0, 1, pass == 0 ? null : round(pass, 4));
+ setValOrBlank(sheet, r0, 1, pass == 0 ? null : pass);
setValOrBlank(sheet, r0, 3, midCumYoy(mid, currentYear, city, maxMonth, 0, true));
- setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4));
+ setValOrBlank(sheet, r0, 5, turn == 0 ? null : turn);
setValOrBlank(sheet, r0, 7, midCumYoy(mid, currentYear, city, maxMonth, 0, false));
// 鍙冲潡褰撴湀锛歀/P 鍊笺�丯/R 褰撴湀鍚屾瘮锛圡/O/Q/S 鎺掑悕鍏紡淇濈暀锛�
double mPass = midClassVal(mid, currentYear, maxMonth, city, 0, true);
double mTurn = midClassVal(mid, currentYear, maxMonth, city, 0, false);
double mLastPass = midClassVal(mid, currentYear - 1, maxMonth, city, 0, true);
double mLastTurn = midClassVal(mid, currentYear - 1, maxMonth, city, 0, false);
- setValOrBlank(sheet, r0, 11, mPass == 0 ? null : round(mPass, 4));
+ setValOrBlank(sheet, r0, 11, mPass == 0 ? null : mPass);
setValOrBlank(sheet, r0, 13, mPass == 0 ? null : midMonthYoy(mid, currentYear, maxMonth, city, 0, true));
- setValOrBlank(sheet, r0, 15, mTurn == 0 ? null : round(mTurn, 4));
+ setValOrBlank(sheet, r0, 15, mTurn == 0 ? null : mTurn);
setValOrBlank(sheet, r0, 17, mTurn == 0 ? null : midMonthYoy(mid, currentYear, maxMonth, city, 0, false));
}
recalc(wb);
@@ -2701,7 +2701,7 @@
private Double yoyOf(double cur, double base) {
if (base == 0.0) return null;
- return round((cur - base) / base, 4);
+ return (cur - base) / base;
}
/** 涓彛寰勫垎绫荤疮璁★紙1..monthCount 鏈堟眰鍜岋級 */
@@ -2743,9 +2743,9 @@
double turn = midCumClass(mid, currentYear, "婀栧寳鐪�", maxMonth, dims[i], false);
double lastPass = midCumClass(mid, currentYear - 1, "婀栧寳鐪�", maxMonth, dims[i], true);
double lastTurn = midCumClass(mid, currentYear - 1, "婀栧寳鐪�", maxMonth, dims[i], false);
- setValOrBlank(sheet, r0, 1, pass == 0 ? null : round(pass, 4));
+ setValOrBlank(sheet, r0, 1, pass == 0 ? null : pass);
setValOrBlank(sheet, r0, 2, midCumYoy(mid, currentYear, "婀栧寳鐪�", maxMonth, dims[i], true));
- setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4));
+ setValOrBlank(sheet, r0, 5, turn == 0 ? null : turn);
setValOrBlank(sheet, r0, 6, midCumYoy(mid, currentYear, "婀栧寳鐪�", maxMonth, dims[i], false));
}
// 涓嬪崐鍧楋紙褰撴湀锛夛細鏍囬琛�9銆佹暟鎹11-15锛�0-based 8銆�10-14锛�
@@ -2759,9 +2759,9 @@
double turn = midClassVal(mid, currentYear, maxMonth, "婀栧寳鐪�", dims[i], false);
double lastPass = midClassVal(mid, currentYear - 1, maxMonth, "婀栧寳鐪�", dims[i], true);
double lastTurn = midClassVal(mid, currentYear - 1, maxMonth, "婀栧寳鐪�", dims[i], false);
- setValOrBlank(sheet, r0, 1, pass == 0 ? null : round(pass, 4));
+ setValOrBlank(sheet, r0, 1, pass == 0 ? null : pass);
setValOrBlank(sheet, r0, 2, pass == 0 ? null : midMonthYoy(mid, currentYear, maxMonth, "婀栧寳鐪�", dims[i], true));
- setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4));
+ setValOrBlank(sheet, r0, 5, turn == 0 ? null : turn);
setValOrBlank(sheet, r0, 6, turn == 0 ? null : midMonthYoy(mid, currentYear, maxMonth, "婀栧寳鐪�", dims[i], false));
}
// 涓嬪崐鍧楀崰姣斿叕寮忕敱鏍蜂緥鎸囧悜涓婂崐鍧楋紙B$3/F$3锛夛紝鏀瑰啓涓烘湰鍧楁�昏锛圔$11/F$11锛夛紝琛�12-15
@@ -3179,7 +3179,7 @@
Cell c = row.getCell(colIdx);
if (c != null && c.getCellType() == org.apache.poi.ss.usermodel.CellType.FORMULA) return;
if (c == null) c = row.createCell(colIdx);
- if (v == 0) c.setBlank(); else c.setCellValue(round(v, 2));
+ if (v == 0) c.setBlank(); else c.setCellValue(v);
}
/** 鏄惧紡鍐欏叆 0锛坰etDataCell 瀵� 0 缃┖锛涙眹鎬昏〃缃戠害杞﹁闇�瑕佹樉绀� 0锛� */
@@ -4643,8 +4643,8 @@
if (r.getAvgDistanceCity() != null && r.getAvgDistanceCity() > 0) a[5] = r.getAvgDistanceCity();
}
for (double[] a : map.values()) {
- if (a[4] <= 0 && a[0] > 0) a[4] = round(a[1] / a[0], 2);
- if (a[5] <= 0 && a[2] > 0) a[5] = round(a[3] / a[2], 2);
+ if (a[4] <= 0 && a[0] > 0) a[4] = a[1] / a[0];
+ if (a[5] <= 0 && a[2] > 0) a[5] = a[3] / a[2];
}
return map;
}
@@ -4960,19 +4960,19 @@
Row row = sheet.getRow(rowIdx);
if (row == null) row = sheet.createRow(rowIdx);
if (a > 0) {
- // 2026骞� 1..N 鏈堬細搴撳唴鏈夊�煎垯濉紙2浣嶅皬鏁帮級锛屾棤鍊兼竻绌烘ā鏉挎牱渚�
+ // 2026骞� 1..N 鏈堬細搴撳唴鏈夊�煎垯濉紙鍏ㄧ簿搴﹀啓鍏ワ紝涓や綅灏忔暟鐢卞崟鍏冩牸鏍煎紡灞曠ず锛夛紝鏃犲�兼竻绌烘ā鏉挎牱渚�
for (int m = 1; m <= month; m++) {
double v = cityVal(monthCity, area, m, k);
Cell c = row.getCell(2 + (m - 1) * 2);
if (c == null) c = row.createCell(2 + (m - 1) * 2);
- if (v == 0) c.setBlank(); else c.setCellValue(round(v, 2));
+ if (v == 0) c.setBlank(); else c.setCellValue(v);
}
// 2025骞� 1..12 鏈堬細搴撳唴鏈夊幓骞存暟鎹垯濉紝鍚﹀垯娓呯┖妯℃澘鏍蜂緥
for (int m = 1; m <= 12; m++) {
double v = cityVal(lastYearMonthCity, area, m, k);
Cell c = row.getCell(19 + (m - 1) * 2);
if (c == null) c = row.createCell(19 + (m - 1) * 2);
- if (v == 0) c.setBlank(); else c.setCellValue(round(v, 2));
+ if (v == 0) c.setBlank(); else c.setCellValue(v);
}
}
rowIdx++;
@@ -5465,7 +5465,7 @@
hssfNum(row, 8, agg.startCum == 0 ? null : agg.startCum);
hssfNum(row, 9, agg.yearPlan == 0 ? null : agg.yearPlan);
hssfNum(row, 22, agg.yearCum == 0 ? null : agg.yearCum);
- if (agg.yearPlan > 0) hssfNum(row, 23, round(agg.yearCum / agg.yearPlan, 4));
+ if (agg.yearPlan > 0) hssfNum(row, 23, agg.yearCum / agg.yearPlan);
}
@@ -5797,7 +5797,7 @@
putNum(row, 2, s[3] == 0 ? null : s[3]);
putNum(row, 3, s[4] == 0 ? null : s[4]);
double b = numOf(row.getCell(1));
- putNum(row, 4, b > 0 ? round(s[3] / b * 100, 4) : null);
+ putNum(row, 4, b > 0 ? s[3] / b * 100 : null);
cT += s[3];
dT += s[4];
}
@@ -5806,7 +5806,7 @@
putNum(tot, 2, cT == 0 ? null : cT);
putNum(tot, 3, dT == 0 ? null : dT);
double b = numOf(tot.getCell(1));
- putNum(tot, 4, b > 0 ? round(cT / b * 100, 4) : null);
+ putNum(tot, 4, b > 0 ? cT / b * 100 : null);
}
}
try {
@@ -6027,7 +6027,7 @@
for (InvestmentMonthly m : monthlies) provinceYearPlan += nz(m.getYearPlan());
HSSFRow rowOther = s1.getRow(9);
for (int c = 1; c <= 5; c++) hssfNum(rowOther, c, null);
- hssfNum(rowOther, 5, provinceYearPlan == 0 ? null : round(provinceYearPlan / 10000, 2));
+ hssfNum(rowOther, 5, provinceYearPlan == 0 ? null : provinceYearPlan / 10000);
// ---- sheet2 瑙勪笂椤圭洰琛細琛ㄥご骞翠唤 + 鍚堣 + 椤圭洰琛� ----
HSSFSheet s2 = wb.getSheetAt(1);
hssfText(s2.getRow(0), 0, year + "骞翠氦閫氬缓璁鹃」鐩偍澶囨儏鍐碉紙瑙勬ā浠ヤ笂椤圭洰锛�");
@@ -6259,6 +6259,8 @@
private double nz(Double v) {
return v == null ? 0.0 : v;
}
+ /** 鏁板�兼牸寮忛噷 3 浣嶅強浠ヤ笂鐨勫皬鏁伴儴鍒嗭紙濡� 0.0000 / 0.000_ 锛� */
+ private static final java.util.regex.Pattern DEC_MORE_THAN_TWO = java.util.regex.Pattern.compile("\\.0{3,}");
/** 鐢熸垚琛ㄦ暟鍊煎垪缁熶竴鏍峰紡锛氫繚鐣欏叏绮惧害鏁板�硷紝鏄剧ず涓や綅灏忔暟锛涙暣鏁板�间笌 %/鏃ユ湡/绉戝璁℃暟绛夋棦鏈夋牱寮忎笉鏀瑰彉 */
private void applyTwoDecimalFormat(org.apache.poi.ss.usermodel.Workbook wb) {
if (wb == null) return;
@@ -6275,24 +6277,32 @@
CellType ct = cell.getCellType();
if (ct != CellType.NUMERIC && ct != CellType.FORMULA) continue;
if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) continue;
- boolean integral = false;
- if (ct == CellType.NUMERIC) {
- integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue();
- } else if (cell.getCachedFormulaResultType() == CellType.NUMERIC) {
- integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue();
- }
- if (integral) continue; // 鏁存暟涓嶆樉绀� .00锛堝惈鍏紡缁撴灉涓烘暣鏁扮殑鏍硷級
org.apache.poi.ss.usermodel.CellStyle cs = cell.getCellStyle();
if (cs == null) continue;
String f = cs.getDataFormatString();
if (f == null) f = "";
- if (f.contains("%") || f.contains("E") || f.contains("0.00")) continue;
- boolean plain = f.isEmpty() || "General".equals(f) || "general".equals(f)
- || "0".equals(f) || "#,##0".equals(f) || "0.0".equals(f) || "#,##0.0".equals(f);
- if (!plain) continue;
+ if (f.contains("%") || f.contains("E") || f.contains("@")) continue;
+ String normalized = null;
+ if (DEC_MORE_THAN_TWO.matcher(f).find()) {
+ // 姣嶇増涓埆鏍煎甫 3~4 浣嶅皬鏁版牸寮忥紙濡� 0.000_ 銆�0.0000_);[Red]\(0.0000\)锛夛細鏁板�间粛鍏ㄧ簿搴︼紝
+ // 灞曠ず缁熶竴鏀舵暃鍒颁袱浣嶃�傝繖绫绘牸鏈氨鎸夋暟鍊兼牸寮忓睍绀猴紝鏁呬笉鍙椼�屾暣鏁颁笉鏄剧ず .00銆嶄繚鎶ゅ奖鍝嶃��
+ normalized = DEC_MORE_THAN_TWO.matcher(f).replaceAll(".00");
+ } else {
+ boolean integral = false;
+ if (ct == CellType.NUMERIC) {
+ integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue();
+ } else if (cell.getCachedFormulaResultType() == CellType.NUMERIC) {
+ integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue();
+ }
+ if (integral) continue; // 鏁存暟涓嶆樉绀� .00锛堝惈鍏紡缁撴灉涓烘暣鏁扮殑鏍硷級
+ if (f.contains("0.00")) continue;
+ boolean plain = f.isEmpty() || "General".equals(f) || "general".equals(f)
+ || "0".equals(f) || "#,##0".equals(f) || "0.0".equals(f) || "#,##0.0".equals(f);
+ if (!plain) continue;
+ }
org.apache.poi.ss.usermodel.CellStyle ns = wb.createCellStyle();
ns.cloneStyleFrom(cs);
- ns.setDataFormat(fmtTwo);
+ ns.setDataFormat(normalized == null ? fmtTwo : df.getFormat(normalized));
cell.setCellStyle(ns);
} catch (Exception ignore) {
// 涓埆鍗曞厓鏍兼牸寮忓紓甯镐笉闃诲瀵煎嚭
--
Gitblit v1.9.1