みなさまこんばんわです。よろしくお願い申し上げます。
VB.NET 2008でFunctionプロシージャを作っています。
その内容は、Double型の値を与えると、その小数点第一位のみをInteger型で返すというものです。
たとえば、3.142を与えると、1を返します。38.98を与えると、9を返します。
これを次のようにコーディングしました。コメントは、39.9を与えたときの動作です。答えは、9を期待しますよね。
-------------------------------------
Function SyosutenWoKaesu(ByVal NyuuryokuSuuchi As Double) As Integer
Dim SyosutenBubun As Double
Dim SeisuuBu As Integer
SeisuuBu = Fix(NyuuryokuSuuchi)
'Fix関数は、入力数値の整数部を返すので、39をInteger型で返します
SyosutenBubun = NyuuryokuSuuchi - CDbl(SeisuuBu)
'データ型をDouble型に変換し、引き算。39.9-39なので、0.9という答えを期待しますが、実際は、0.899999999999999が返ってきます
SyosutenBubun = SyosutenBubun * 10
SyosutenWoKaesu = Fix(SyosutenBubun)
'10倍した数の整数部なので、8を返します。困ります。
End Function
-------------------------------------
なんで 39.9 - 39 が0.9じゃないんでしょうか?
しかも、10.9など、少ない数字だと、きちんと演算されます。また、100.9などだと、途中、0.900000000000006などの数値になるんですけど、答えはきちんと9を出力します。
また、小数点第一位が9以外だと、うまくいくんです。
ちなみに、CDbl関数を使わなくても同じでした。また、-演算子の代わりに、Mod演算子(割り算の余りを返す演算子)を使っても全く同じでした。
なんでこんな不正確な演算結果になるんでしょうか?
あるいは、別のもっとスマートな方法がありますでしょうか?
よろしくお願い申し上げます。
No.1ベストアンサー
- 回答日時:
浮動小数点の演算による誤差でしょうね
小数第1位の数値を返すのなら
Function SyosutenWoKaesu(ByVal NyuuryokuSuuchi As Double) As Integer
dim n as Integer
n = ( NyuuryokuSuuchi * 10 ) mod 10
return n
End Function
でうまくいきそうですが ・・・
ご回答いただき、ありがとうございます!!
やはり、小数点はどうしても誤差が出るようです。Single型にすると、いっそう誤差が大きいです。
で、ご回答いただいたコード・・・
目から鱗でした!
無理に小数点演算をするんじゃなくて、いったん10倍して1のくらいにまで引き上げてから、1桁目を求めるとは・・・これはイイです!!!
コードを書いてみましたが、やはり小数点の演算にならないので、問題なく動きました! ありがとうございました!
実際は、小数点第2位以下があることを考慮し、最後にFix関数で小数点をすべて切り捨て、整数だけにしてInteger型で返すようにすれば、問題となった誤差は一切発生せず、上手く動いています。
完全に解決しました。ありがとうございました!!!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- Excel(エクセル) excel2013 色付きセルの値合計 3 2023/02/28 11:48
- Excel(エクセル) バイナリー演算を勉強したい 1 2023/04/19 14:17
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/01/11 08:33
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAのIf,Then 構...
-
0xffffとは?
-
PS3に搭載されている"Cell"は、...
-
符号無し整数xを右にnビット回転
-
8ビットのデータの、先頭ビット...
-
二元対称無記憶通信路を実現す...
-
16ビットCPUで32ビットの計算方法
-
文字参照は10進数と16進数では...
-
C言語で128bitの2進数のビット...
-
三菱シーケンサーの命令でFROM ...
-
ライン数とステップ数の違いは?
-
アセンブラで割り算
-
バイナリの実行ファイルをgccを...
-
SRAMとレジスタの違いは何でし...
-
PICはアセンブラとC言語のどち...
-
制御系ってSTL必要なんですか?
-
PICでパルス数をカウントする方法
-
PICでパルス数をカウントし、カ...
-
【H8マイコン】HEWで埋め込みア...
-
アセンブラからC言語に変換する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
情報科学の飽和演算、ラップア...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
文字参照は10進数と16進数では...
-
スロースキャンコンピュータ 加...
-
C言語で128bitの2進数のビット...
-
命令について
-
シーケンス制御についての質問...
-
03分22秒36のような時間の単位...
-
verilog 符号付加減算(最上位...
-
[VBS] 素早くローテート演算したい
-
CASLIIでかけ算
-
符号無し整数xを右にnビット回転
-
算術シフト演算が成り立つ理由...
-
PLC 命令について
-
二元対称無記憶通信路を実現す...
-
2の補数
おすすめ情報