「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@649) [中] [解決]
@649■ (#2049) 形式指定した後の数値比較 - ぴろりん (2012-10-17 20:57) /中 未処理
【症状】どのような症状、現象か?
 数値を指定形式で指定したあとの比較がおかしい

【再現方法】サンプルソース、再現手順など
#ここから
判定距離=15.123
距離A=5.432
もし、(判定距離>距離A)ならば「結果1は{距離A}」を表示 #5.432表示する…OK
距離A=距離Aを「%.1f」で形式指定
判定距離=判定距離を「%.1f」で形式指定
もし、(判定距離<距離A)ならば「結果2は{距離A}」を表示 #5.4表示する…NG
もし、(判定距離>距離A)ならば「結果3は{距離A}」を表示 #表示しない…NG
もし、(判定距離-距離A>0)ならば「結果4は{判定距離-距離A}」を表示 #9.7表示する…OK
#ここまで

【要望】どのような解決が望ましいか?
 正常に比較できればうれしいです。

【バージョン】確認したバージョン
バージョン:1.53352
最終更新日:2012/07/14
OS   :Windows 7 [6.1(7601:2)]
【その他】
 距離Aの宣言時は実数、形式指定した後は文字列になることは理解しております。
 比較は変(逆?)になるのに、引き算すればOKというのも不思議ですね。
 距離Aを10より大きい数(この例だと距離A=12.34など)にすると正常に判定してくれます。
 10より小さい数値のときだけ、どうも比較だけがおかしくなるようです…?
 現状でも引き算にすれば対応できるので、まあ、急いではおりませんが…(^^;

(#2050) 文字列比較として正常。 - うぇいく (2012-10-17 22:48) /中 未処理
なでしこに限りませんが・・・1つ1つ見てゆくと、どれも正常です。

 型が緩い言語で、数値にしか適用できない演算子を適用して、型を暗黙的に変換するというのは、わりとポピュラーな方法です(大抵は、0に足したり、0を引いたりする)。演算される前に、暗黙的に型が変換されて、結果もその型に合ったものになります。演算結果を適用した結果は、数値になりますので、数値の0との比較は期待通りに動きます。

 その前は数値だったとか、形式指定使ったとか関係なく、比較している時点では、「15.123」と「5.432」の文字列比較です。
 文字列同士では、最初の文字から順に文字コード(か、辞書順)が比較されてゆきますから、「1」と「5」を比較して、「5」の方が大きいというのは、あなたが期待した動作とは違うかもしれませんが、正常な動作です。あくまでも、たまたま数値に見える、文字列同士の比較になります。

10より大きな数値で検証する場合でも、判定距離120.5と距離Aを50.1のように、文字列と数値での比較で結果が逆転する関係しないと、「たまたま数値比較の結果と同じになるため正しく見えて」しまいます(同じ桁の数値は、検証に使う値としては不適切。)

結局のところ、数値として比較したい場合は、何らかの方法で(暗黙的でも明示的でも)必ず数値に変換する必要があります。
(もし、文字列と数値の比較演算子が異なるなら、数値用の比較演算子を使うのが簡単ですが、なでしこには無いかもしれません)

これを言語として無理にしようとすると、数値に変換可能な文字列同士の比較は、常に数値比較するように変更することになると思いますが、おそらくは、どちらかというと不便になるのではないかと思います。

(#2051) 文字列比較なんですね!ありがとうございました - ぴろりん (2012-10-18 00:04) /中 解決
すごく早い回答にビックリです。ありがとうございます。

なるほど!すべて文字列の比較だったんですね。納得しました。
型変数でも確認して、てっきり数値と文字列の比較と思い込んでいました。
うぇいくさんの仰る通り、たまたま桁があって比較できていたですね。

なでしこは、変数を宣言しないところが使いやすいので、とても気に入っていますが、それゆえプログラミングをかじった程度の素人では、よく嵌ってしまいます。
(単なる勉強不足ですが…)
なでしこは、業務でCSVデータの整形などで最近使い始めていますが、とても使いやすくて気に入っております。
これからも頑張りたいと思います。
どうもありがとうございました!

(#2049)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能