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