1

会計システムを構築しているときに、大きな問題に遭遇しました。請求書を作成した後、負の値と同じ金額のクレジットを適用する必要があるとしましょう。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

私は本当にここで立ち往生しているので、助けていただければ幸いです。どうもありがとうございました

4

2 に答える 2

1

それが正か負かを確認し、var(1または-1)に符号を割り当て、絶対値(Math.abs(value))を取り、それを丸めます。次に、それを符号で乗算して結果を取得します。

そうすれば、常に同じ結果が得られ、それが正か負かは関係ありません。

于 2012-11-27T16:36:31.227 に答える
0

実際には、丸めによって、正の値とは逆の結果が負の値に提供されることを期待しています。簡単な方法は、正の値の場合は切り捨て、負の値の場合はUPに丸めることです。(または、正の場合は上に、負の場合は下に、有効です)。秘訣は、値が2つの可能な丸め結果の真ん中にある場合、NEARESTは常に切り上げ、負の数のみを切り下げたいということです。

于 2012-11-27T16:08:47.277 に答える