会計システムを構築しているときに、大きな問題に遭遇しました。請求書を作成した後、負の値と同じ金額のクレジットを適用する必要があるとしましょう。1セントの丸めの問題が発生することがあります。
私の問題は負の値のみに関するものです!
特定の正の値と負の値をテストしているこのスクリプトを見てみましょう。デバッグの目的で、パラメーターexpectedResultも送信します。
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="creationCompleteHandler()">
<fx:Script>
<![CDATA[
import mx.formatters.CurrencyFormatter;
import mx.formatters.NumberBaseRoundType;
private function roundDecimal(num:Number, expectedResult:Number):void
{
var rnd:CurrencyFormatter = new CurrencyFormatter();
rnd.precision = 2;
rnd.useThousandsSeparator = false;
rnd.currencySymbol = '';
if (num >= 0)
rnd.rounding = NumberBaseRoundType.NEAREST;
else
rnd.rounding = NumberBaseRoundType.DOWN; // The problem is here, ALWAYS!
var result:Number = Number(rnd.format(num));
if (result != expectedResult)
trace("Error : " + result + " (Expecting " + expectedResult + ")");
else
trace("OK : " + result);
}
protected function creationCompleteHandler():void
{
var num:Number;
var expectedResult:Number;
// Test number 1
num = 5.653;
expectedResult = 5.65;
roundDecimal(num, expectedResult);
roundDecimal(-(num), -(expectedResult));
trace("------------");
// Test number 2
num = 5.655;
expectedResult = 5.66;
roundDecimal(num, expectedResult);
roundDecimal(-(num), -(expectedResult));
trace("------------");
// Test number 3
num = 5.657;
expectedResult = 5.66;
roundDecimal(num, expectedResult);
roundDecimal(-(num), -(expectedResult));
}
]]>
</fx:Script>
</s:WindowedApplication>
もちろん、負の値の丸めタイプを変更しようとしましたが、成功しませんでした。
さまざまな丸めタイプとその結果を見てください。
//////////// Test 1 ////////////
if (num >= 0)
rnd.rounding = NumberBaseRoundType.NEAREST;
else
rnd.rounding = NumberBaseRoundType.DOWN; // The problem is here, ALWAYS!
OK : 5.65
Error : -5.66 (Expecting -5.65)
------------
OK : 5.66
OK : -5.66
------------
OK : 5.66
OK : -5.66
//////////// Test 2 ////////////
if (num >= 0)
rnd.rounding = NumberBaseRoundType.NEAREST;
else
rnd.rounding = NumberBaseRoundType.UP;
OK : 5.65
OK : -5.65
------------
OK : 5.66
Error : -5.65 (Expecting -5.66)
------------
OK : 5.66
Error : -5.65 (Expecting -5.66)
//////////// Test 3 ////////////
if (num >= 0)
rnd.rounding = NumberBaseRoundType.NEAREST;
else
rnd.rounding = NumberBaseRoundType.NEAREST; // The problem is here, ALWAYS!
OK : 5.65
OK : -5.65
------------
OK : 5.66
Error : -5.65 (Expecting -5.66)
------------
OK : 5.66
OK : -5.66
私は本当にここで立ち往生しているので、助けていただければ幸いです。どうもありがとうございました!