計算結果表示No.05864
W.Hiroshi さん 08/05/26 22:09
 
いつもお世話になっています。W.Hiroshi です。

以前、秀丸マクロで計算した結果表示がおかしな表示になるという件で相談させて頂
きました。その時は、秀丸本体側の計算精度を落とすと言うことで、対応して頂きま
した。
その時の数値では、それで正常に表示できる様になったので、解決したと思っていた
のですが、使っているうちに、別の数値では、やはり同じような現象が起きることが
分かりました。

やはり、10進数を2進数に変換して計算した後、計算結果をもう一度、10進数に変換
して表示するとき、誤差が出てしまうのかと思います。

いろいろ試してみたところ、エクセルでも同様のことが起きることが分かりました。

手元にあった エクセル2000では
C1セルに、「=A1-B1」として、C1セルの書式で数値の小数点以下の表示桁数を20桁ぐ
らいにすると

ABC
64 63.9 0.10000000000000100000
64 63.8 0.20000000000000300000
64 63.7 0.29999999999999700000
64 63.6 0.39999999999999900000
64 63.5 0.50000000000000000000
64 63.4 0.60000000000000100000
64 63.3 0.70000000000000300000
64 63.2 0.79999999999999700000
64 63.1 0.89999999999999900000
64   63  1.00000000000000000000


ので、
この問題を、秀丸本体で完全対応を求めるのは無理があるのかと思います。
元々、そういう風に表示されてしまうのが当たり前なのかも。

前置きが長くなりましたが、ここからが本題です。

今、私が必要としているのは、小数点以下3桁までなので、

浮動小数点モードのマクロで

 $a = dllfuncstr( "Format", "%.3lf", val($s) + val($$2) );

のような文を使うと、計算結果を小数点以下3桁に丸めることが出来ると思うのですが、
これだと、たとえば

0.300 のように、2桁目3桁目に数値が無くても、0が表示されてしまいます。
右側に0以外の数値が無く、0だけが続く場合は、0を削除したいのですが。どのよう
にすればいいでしょう。
ただし、小数点以下1桁目だけは必ず表示する事とします。


1.234 --> 1.234
1.230 --> 1.23
1.200 --> 1.2
1.000 --> 1.0

何かよいアイデアがありましたら教えてください。
よろしくお願いします。

[ ]
RE:05864 計算結果表示No.05865
きいろいまふらあ さん 08/05/26 22:51
 
きいろいまふらあと申します。

>右側に0以外の数値が無く、0だけが続く場合は、0を削除したいのですが。どのよう
>にすればいいでしょう。
>ただし、小数点以下1桁目だけは必ず表示する事とします。

泥臭いですが、

$a = dllfuncstr( "Format", "%.3lf", val($s) + val($$2) );

の後に

if(rightstr($a,2) == "00"){
    $a = leftstr($a, strlen($a)-2);
elseif{rightstr($a,1) == "0"){
    $a = leftstr($a, strlen($a)-1);
}

などとしてはどうでしょう?
桁数が不定の場合は、

while(rightstr($a,1) == "0"){
    $a = leftstr($a, strlen($a)-1);
}
if(rightstr($a,1) == "."){
    $a = $a + "0";
}

としてもよいかもしれません。

[ ]
RE:05864 計算結果表示No.05866
h-tom さん 08/05/26 22:52
 

h-tom です。

>浮動小数点モードのマクロで
>
> $a = dllfuncstr( "Format", "%.3lf", val($s) + val($$2) );
>
>のような文を使うと、計算結果を小数点以下3桁に丸めることが出来ると思うのです
>が、
>これだと、たとえば
>
>0.300 のように、2桁目3桁目に数値が無くても、0が表示されてしまいます。
>右側に0以外の数値が無く、0だけが続く場合は、0を削除したいのですが。どのよう
>にすればいいでしょう。
>ただし、小数点以下1桁目だけは必ず表示する事とします。
>
>
>1.234 --> 1.234
>1.230 --> 1.23
>1.200 --> 1.2
>1.000 --> 1.0
>
>何かよいアイデアがありましたら教えてください。
>よろしくお願いします。
小数点以下1桁目を考量しなければ、
  $a = str(val($a));

とすれば、いいので、こんな感じでどうでしょう。

$a = dllfuncstr( "Format", "%.3lf", val($s) + val($$2) );
if(strstr($a, ".000") > -1){
    $a = leftstr($a,3);
}else{
    $a = str(val($a));
}

[ ]
RE:05864 計算結果表示No.05868
ENCODINGSHIFTJIS さん 08/05/27 11:27
 
まとめてテキスト処理の場合
(\.[0-9]+?)0+([^0-9])

\1\2

[ ]
RE:05865 計算結果表示No.05869
W.Hiroshi さん 08/05/28 10:08
 
きいろいまふらあ さん 
h-tom さん 
ENCODINGSHIFTJIS さん 
まとめて失礼します。

素早い対応有り難うございました。
これで、ほぼ予定通りのマクロが完成しそうです。

[ ]