![]() |
發布時間: 2021-7-28 09:11
正文摘要:本人根據四舍六入奇進偶不進原則,利用vba做了個自定義的函數,希望對大家有用。 函數語音是 Round2(被修約數據,小數位數) 例如把3.45修約保留一位小數,就是 =round(3.45,1) 此表格 ... |
感謝樓主分享。 |
感謝樓主分享 |
感謝樓主分享 |
謝謝樓主的分享,最近也在開始自學用宏,正好用你的來學習下。 |
路云 發表于 2023-11-15 00:17 而且他只考慮輸入一個小數的情況,如果是運算的結果,他無法避免浮點數字的影響。 |
sunrry 發表于 2023-9-22 14:57 您說得沒錯。那不是數值修約,而是文本處理??梢詤㈤單遗c他的討論:保留位數EXCEL實現 |
sunrry 發表于 2021-7-29 11:48 正因為宏代碼容易被殺毒軟件干掉,才一直追求避開宏代碼。如果用自定義函數和格式設置就方便多了。跟尺規作圖類似,故意增加難度。 |
wangyiyong7703 發表于 2023-10-7 15:05 幫我分析一下,16-18有出現問題了 |
微信圖片_20231007153504.png (23.87 KB, 下載次數: 368)
sunrry 發表于 2023-10-7 13:09 我看了一下,不是我要解決浮點問題,是你的輸入本來就有問題,6.94999999999999,不是顯示的6.95 |
微信圖片_20231007180624.png (14.14 KB, 下載次數: 710)
本帖最后由 wangyiyong7703 于 2023-10-7 15:29 編輯 sunrry 發表于 2023-10-7 13:20 我設計的是保留多少位小數的,1位以上,不含0位的。0位及以上可以再設計。主要是出現整數后的加零補位。你說的浮點問題具體指出來,我的是沒有的 |
sunrry 發表于 2023-10-7 13:09 謝謝,,,,,, |
=IF(ABS(ABS(A2/1*10^B2-TRUNC(A2/1,B2)*10^B2)-0.5)<10^-7,CEILING(ABS(TRUNC(A2/1,B2)),2*10^-B2)*SIGN(A2/1)*1,ROUND(A2/1,B2)*1) |
sunrry 發表于 2023-9-25 13:21 新的算法做的,麻煩抽空指正一下。 |
IF(OR(AND(ISEVEN(MID(A2,FIND(".",A2)+B2,1)*1),MID(A2,FIND(".",A2)+B2+1,1)="5",IFERROR(RIGHT(A2,LEN(A2)-FIND(".",A2)-B2-1)*1,0)=0),MID(A2,FIND(".",A2)+B2+1,1)*1<5),LEFT(A2,FIND(".",A2,1)+B2),IF(IFERROR(FIND(".",LEFT(A2,FIND(".",A2,1)*1+B2)*1+IF(A2*1<0,-1,1)/POWER(10,B2),1),0)=0,LEFT(A2,FIND(".",A2,1)*1+B2)*1+IF(A2*1<0,-1,1)/POWER(10,B2)&"."&REPT("0",B2),LEFT(A2,FIND(".",A2,1)*1+B2)*1+IF(A2*1<0,-1,1)/POWER(10,B2)&REPT("0",B2-(LEN(LEFT(A2,FIND(".",A2,1)*1+B2)*1+IF(A2*1<0,-1,1)/POWER(10,B2))-IFERROR(FIND(".",LEFT(A2,FIND(".",A2,1)*1+B2)*1+IF(A2*1<0,-1,1)/POWER(10,B2),1),0))))) |
wangyiyong7703 發表于 2023-9-22 17:11 對對對,你說的都對。 |
sunrry 發表于 2023-9-22 14:57 開始設計有點麻煩而已,你直接復制使用有什么麻煩的。如果你用宏去做才真的麻煩。這個公式避開了宏代碼,也相當于宏代碼 |
wangyiyong7703 發表于 2023-9-18 18:34 你不覺得你的公式很麻煩么。。。。 |
A2輸入待修約數值,B2輸入保留小數點位數,C2輸入公式。對9.9999多的情況不適用,還待改進 IF(B2=0,IF(OR(AND(ISEVEN(INT(A2)),A2-INT(A2)=0.5),A2-INT(A2)<0.5),INT(A2),INT(A2)+1),IF(LEN(IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2)))=LEN(INT(A2)),IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2))&"."&REPT("0",B2),IF(LEN(INT(A2*POWER(10,B2)))+1>LEN((IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2)))),(IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2)))&REPT("0",LEN(INT(A2*POWER(10,B2)))-1-LEN((IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2))))),IF(OR(AND(ISEVEN(INT(A2*POWER(10,B2))),A2*POWER(10,B2)-INT(A2*POWER(10,B2))=0.5),A2*POWER(10,B2)-INT(A2*POWER(10,B2))<0.5),INT(A2*POWER(10,B2))/POWER(10,B2),(INT(A2*POWER(10,B2))+1)/POWER(10,B2))))) |
特殊情況適應了么,3.001,8.9999。還是用了編程,要全部用內建函數。編程可以把很多漏洞補上 |
難者不會 會者不難 |
excel里面的修約函數也沒有2間隔、5間隔之類的 |
連長 發表于 2021-7-30 15:05 修約間隔為5和10的可以再搞個函數,或者直接拿這個數除相應的數以后修約再乘回來 |
小黑屋|Archiver|計量論壇
( 閩ICP備06005787號-1—304所 )
電話:0592-5613810 QQ:473647 微信:gfjlbbs閩公網安備 35020602000072號
GMT+8, 2025-7-20 18:21
Powered by Discuz! X3.4
Copyright © 2001-2023, Tencent Cloud.