|
出来るのだASP Q&A掲示板(過去LOG)
訪問数 52046
昨日 889
今日 776 【PR】 パソコン入門からIT専門書まで幅広く取り揃えています。セブン-イレブン受取り手数料無料のセブンアンドワイ。 |
Topに戻る
掲示板に戻る
検索
削除
管理者
|
![]()
VBScript の Round関数にはバグがあります
北岳さん
[2002/03/08 7:00:32]
[1831]
|
Re:VBScript の Round関数にはバグがあります
北岳さん
[2002/03/08 9:02:12]
[1832]
Re:VBScript の Round関数にはバグがあります
arikさん
[2002/03/08 11:45:02]
[1833]
Re:VBScript の Round関数にはバグがあります
arikさん
[2002/03/08 16:15:53]
[1836]
Re:VBScript の Round関数にはバグがあります
たまコさん
[2002/03/08 12:25:47]
[1834]
VBScript の Round関数は使い方注意
北岳さん
[2002/03/08 15:57:50]
[1835]
|
| [1831] VBScript の Round関数にはバグがあります |
| 投稿者:北岳さん 2002/03/08 7:00:32 |
| round関数を WIN98+PWS(VBScript 5.5.6330)にて検証した結果です。 (1)は整数、(2)〜(4)は実数を得る関数。 -------------------------------- ■(1) VBSの INT(x) 関数【正常】 <% for x=-9.5 to 9.5 step 1 response.write INT(x) & "," next %> 結果:-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9, 小さい方の整数にするという定義内で正常。 -------------------------------- ■(2) VBSの ROUND(x,y) 関数【異常】 <% for x=-9.5 to 9.5 step 1 response.write round(x) & "," '(a) 'response.write round(x,0) & "," '(b) next %> 結果(a)(b)とも:-10,-8,-8,-6,-6,-4,-4,-2,-2,0,0,2,2,4,4,6,6,8,8,10, ???(絶句) -------------------------------- ■(3) EXCEL 95&97 の ROUND(x,y) 関数【正常】 セル(A1)に-9.5、(A2)に-8.5・・・(A20)に9.5、 セル(B1)に =@ROUND(A1,0) ・・・(B20)に =@ROUND(A20,0) 結果:-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10 しっかり四捨五入しています。 -------------------------------- □(4') 前回アップの自作 ROUNDX(x,y) 関数【異常】 結果:-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9, 済みません、正数は五捨六入になっていました。 (桁揃えのためVBで5年以上使っていましたが、全然気がつかなんだ・・・) -------------------------------- ■(4) 修正版 ROUNDX(x,y) 関数【正常(のつもりです)】 <% Function roundx(X, Y) z = X * 10 ^ Y a = Int(X * 10 ^ Y) If x>=0 and z - a >= 0.5 Then a = a + 1 if x<0 and z - a > 0.5 then a = a + 1 roundx = a / 10 ^ Y End Function %> 結果:-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10 (3)EXCEL のround(x,y)関数 と同じ結果が得られました。 -------------------------------------------- ご指摘頂いた [1762]「↑小数点以下を四捨五入したい」 かすみさん 2002/02/27 のスレッドの喜平さんにお礼申し上げます。 |
| [1832] Re:VBScript の Round関数にはバグがあります |
| 投稿者:北岳さん 2002/03/08 9:02:12 |
| 【再チェック】 -------- roundx.asp -------- <html><body> <% Function roundx(X, Y) z = X * 10 ^ Y a = Int(X * 10 ^ Y) If x>=0 and z - a >= 0.5 Then a = a + 1 if x<0 and z - a > 0.5 then a = a + 1 roundx = a / 10 ^ Y End Function '--- response.write "整数へ<br>" for i=-9.5 to 9.5 step 1 response.write i & "," next response.write "<br>" for i=-9.5 to 9.5 step 1 response.write roundx(i,0) & "," next '--- response.write "<p>小数へ<br>" for i=9.044 to 9.056 step 0.001 response.write i & "," next response.write "<br>" for i=9.044 to 9.056 step 0.001 response.write roundx(i,2) & " ," next %> </body></html> -------------------------- 【結果】 整数へ -9.5,-8.5,-7.5,-6.5,-5.5,-4.5,-3.5,-2.5,-1.5,-0.5,0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5, -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10, 小数へ 9.044,9.045,9.046,9.047,9.048,9.049,9.05,9.051,9.052,9.053,9.05399999999999,9.05499999999999,9.05599999999999, 9.04 ,9.05 ,9.05 ,9.05 ,9.05 ,9.05 ,9.05 ,9.05 ,9.05 ,9.05 ,9.05 ,9.05 ,9.06 , 9.055を四捨五入して9.06を得る筈のところが、9.05499999999999 に化けて9.05になってますね。 ややこしい・・・ |
| [1833] Re:VBScript の Round関数にはバグがあります |
| 投稿者:arikさん 2002/03/08 11:45:02 |
| VB系のRound関数四捨五入する為の関数ではありません。 小数点以下を丸めるための関数です。 以下MSDNから抜粋 端数の処理方法は、小数点以下 1 桁目の数値によって決まります。小数点以下 1 桁目が 5 未満の場合は切り捨てられ、6 以上の場合は切り上げられます。5 の場合は、整数部分の 1 桁目の値が偶数であれば切り捨てられ、奇数であれば切り上げられます。小数点以下 1 桁目が 5 のときは、常に偶数の整数が結果として返されます。 Round 関数は、指定した小数桁数を含む数値を返すには便利ですが、処理される端数が 5 である場合の結果を常に予測できるわけではありません。端数の処理方法は、内部処理における数値のバイナリ表示によって異なります。予測可能な値に従って小数を処理するには、独自の関数を記述する必要があります。 抜粋終わり よって(2)は異常ではありませんし、Round関数のバグではありません。 (3)のRound関数はVB系の関数ではなくExcelのワークシート関数です。 ExcelのHELPのワークシート関数のRound関数には「四捨五入」と明記されてます。 ExcelVBAのHELPと比べると理解できるかと思います。 |
| [1836] Re:VBScript の Round関数にはバグがあります |
| 投稿者:arikさん 2002/03/08 16:15:53 |
| 関連話題 http://www7.big.or.jp/~pinball/discus/freetalk/224.html 注:↑いずれリンクが切れます http://dictionary.goo.ne.jp/cgi-bin/jp-more_print.cgi?MT=%B4%DD%A4%E1%A4%EB&ID=a4de/19285900.txt&sw=2 |
| [1834] Re:VBScript の Round関数にはバグがあります |
| 投稿者:たまコさん 2002/03/08 12:25:47 |
| Round ≠ 四捨五入なのでunibonさんのサイトが参考になります。 http://www.geocities.co.jp/SiliconValley/4334/unibon/asp/round.html |
| [1835] VBScript の Round関数は使い方注意 |
| 投稿者:北岳さん 2002/03/08 15:57:50 |
| > Round ≠ 四捨五入 はて、「端数を丸める」=「四捨五入」では? えっと、 9.5を切り上げて10にする、切り下げて9にする、四捨五入して10にする。 この3つの操作をまとめて日本語で言うと・・・「丸める」。 丸めるを英語に直すと・・・「round」。 なるほど、納得。・・・なんか化かされたような。 まあ、今回はMS社も、しょうがないからこうした、というのが正しそうで、 バグ(プログラムミス)は間違いだったようです。 しかし例えば仮定の話で「8.5をラウンドして8にし、9.5はラウンドして10にする。」 ようなのが、単純にプログラマの勘違いによる本物のバグだったにしても、 みんなは「仕様」で許すんでしょうね。 |
|
TreeBBS For ASP V.0.1.3 |