Skip to main content
Announcements
Accelerate Your Success: Fuel your data and AI journey with the right services, delivered by our experts. Learn More
cancel
Showing results for 
Search instead for 
Did you mean: 
ckjp_sanei
Contributor
Contributor

小数点の取り扱いについて

お世話になっております。

Qlik sense desktopの最新版(june 2019)を利用してしています。

割引率をグループ化するためにclass関数やfloor関数を使ったのですが
下記の表のように予期しない結果になり困っております。

■読み込んだ元データ

割引率割引率1
0.101.00
0.200.90
0.300.80
0.400.70
0.500.60
0.600.50
0.700.40
0.800.30
0.900.20
1.000.10

 

■floor関数を使った結果

割引率=floor([割引率],0.1)割引率1=floor([割引率1],0.1)
0.100.101.001.00
0.200.200.900.90
0.300.200.800.80
0.400.400.700.60
0.500.500.600.50
0.600.500.500.50
0.700.600.400.40
0.800.800.300.20
0.900.900.200.20
1.001.000.100.10

 

floor関数は単純に切り捨てられるはずなのに
0.3 → 0.2
0.6 → 0.5
0.7 → 0.6

となっています。

何が起きているのでしょうか??

原因および対応策があれば教えていただけないでしょうか。
どうぞよろしくお願いいたします。

2 Replies
hmapgo03032006
Contributor II
Contributor II

QlikView では、浮動小数点を使用時に IEEE 754 を使用しており、IEEE の
倍精度の問題から QlikView の計算結果に誤差が発生する場合があります。

▼IEEE 754とは

IEEE(米国電気電子技術者協会)が定めた浮動小数点演算の規格です。

この浮動小数点形式を使用しているため、演算の誤差が発生します。
浮動小数点演算は、指数形式の数値を使う計算のことです。

例えば、同じ値でも内部的には 3 つのパターンのいずれかで値を保持します。
例えば1.75という値の場合以下のいずれかの値で保持されます。

1.7500000000000001
1.7500000000000000
1.7499999999999999

これらの値はすべて1.75とみなされます。

今回のように Floor 関数による値の切り下げを行う場合、切り下げする
桁数より下位で一度 Round 関数(四捨五入)を実施し、その値に対して、
Floor 関数を実施するように指定する事で回避でき、推奨されております。

よって今回の場合は以下のような数式を利用する事で正しい値を求めることができます。

Floor(Round(割引率/1000,0.00001)*1000,0.1)

回避できるかご確認ください。

ckjp_sanei
Contributor
Contributor
Author

無事に回避できました。

非常に分かりやすい説明、回避策ありがとうございます。

切り捨て、切り上げする際は気を付けたいと思います。