Next Page

1

Previous Page

スレッド: intでの小数点以下切り捨て処理

作成日: 03/18/22 01:41 PM

返信: 1

miyo


新米


入会日: 09/18/08

投稿数: 10

intでの小数点以下切り捨て処理
03/18/22 1:41 PM

colsfuionバージョン:9,0,1,274733
intを使って小数点以下切り捨てしている処理で意図しない数値になります。
もしかすると元々そういう仕様なのかもしれませんが、もしご存じの方いらっしゃいましたら
教えてください。


Variables.KAKERITSUには元々クエリーで入ってきた値(例:57)を入れます。
<CFSET variables.KAKERITSU = qry_a.KAKERITSU >
<CFSET Variables.KAKERITSU = Variables.KAKERITSU/100> 57は57%の意味のためを0.57に。
<CFSET Variables.NOUNYU_TANKA = qry_b.TEIKA * Variables.KAKERITSU> 定価(例:100)*掛け率を計算


<CFSET Variables.TANKA_JUDGE = numberFormat(int(variables.NOUNYU_TANKA),"_.__")>
小数点以下切り捨てのため、intで切り捨て。

このようにすると、Variables.TANKA_JUDGE は 57.00 になるはずが、56.00となります。
ただし★部分に
<CFSET variables.NOUNYU_TANKA = numberFormat(variables.NOUNYU_TANKA,"_.____")>
と一旦小数点以下の桁を与えると問題なく57.00となります。
ちなみにVariables.KAKERITSUにクエリーで取得した掛率ではなく、強制的に57を与えると57.00となります。

一応<CFSET variables.NOUNYU_TANKA = numberFormat(variables.NOUNYU_TANKA,"_.____")>を入れることにしましたが、切り捨てする前の数字に切り捨て部分がないのが問題なのでしょうか。

以上、よろしくお願いいたします。

**miyo**

Link | Top | Bottom

mur


半人前


入会日: 06/04/07

投稿数: 24

RE: intでの小数点以下切り捨て処理
03/18/22 6:55 PM

浮動小数点の丸め誤差が発生していると思います。
(内部でvariables.NOUNYU_TANKAの値が 56.999999999999...になっているパターンです)

計算式に対してPrecisionEvaluate関数を使ってみてもらえますか?
<CFSET Variables.NOUNYU_TANKA = PrecisionEvaluate(qry_b.TEIKA * Variables.KAKERITSU)>

PrecisionEvaluate関数を使用すると、BigDecimal型で計算するので、
精度が高い浮動小数点の計算が可能です。
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-m-r/precisionevaluate.html

Link | Top | Bottom

Next Page

1

Previous Page

新規投稿

ログイン して返信して下さい。