1

22桁の数字の割り算をしたいです。ロータス スクリプトで。

誰か教えてください。正しい結果が得られません。

例えば;

Dim num as Double;

Dim num1 を Double として。

数値 = 123456789989898976765;

num1 = num / 97;

しかし、num1で正しい結果が得られません。

4

4 に答える 4

6

私の数学者を満足させるために、「正しい」答えを得ることは決してないだろうと言わなければなりません.除算は無限小数を持つ数を生成しますが、私はあなたが求めているものを得ると思います. ご希望の番号は次のとおりです。

1 272 750 412 266 999 760.463 917 525 ...

しかし、あなたが得ている数は次のとおりです。

1 272 750 412 266 999 800

これは、言語で使用される数値形式の精度が不足しているためです。除算を行っても精度の低下は発生しません。変数に定数を割り当てるとすぐに、精度の低下が発生します。保存する番号は次のとおりです。

123 456 789 989 898 976 765

しかし、実際に保存している数は次のとおりです。

123 456 789 989 898 980 000

これが間違った答えの原因です。

私は Lotus Script 環境を知らないので、次の 2 つのことを行います。最初に、この特定の問題を修正するコードを次のように提供します。

var num = [12345678998, 9898976765];
var num1 = num[0] / 97;
var num2 = Math.floor(num1);
num2 = num1 - num2;
num2 *= 97;
num2 = Math.round(num2)
num2 *= Math.pow(10, num[1].toString().length);
num2 = (num2 + num[1]) / 97;
alert(Math.floor(num1).toString() + num2.toString());

ニーズに合わせて一般化できます。このコードは、除算を数値ストレージ形式で処理できる 2 つの小さな除算に分割し、最初の除算の残りを 2 番目の除算に追加して、次の結果を生成します。

1 272 750 412 266 999 760.463 917 7

これは正確ではありませんが、おそらく十分に近いでしょう? 精度を落とさずに大きな数をフラグメントに分割する方法は、2 人に任されています。(ヒント: 文字列を使用)

次に、BigInt.jsを紹介します。これは、JavaScript で任意に大きな整数を計算するためのライブラリです。このライブラリをコードに含めることができれば、間違いなくより経済的な方法です。

これらのいずれかが役立つことを願っています。

于 2012-05-17T14:34:08.693 に答える
2

問題は、除算に浮動小数点数を使用しているため、正確な結果が得られないことです。Lotusscript は float 以外の大きな数をサポートしていないため、計算を行う別の方法を見つける必要があります。たとえば、コードを Java で記述できる場合は、大きな数をより適切にサポートできます。または、別の例が示すように、これを JavaScript でも処理できるようです。

于 2012-05-17T14:36:30.810 に答える
1

この問題を解決するためにJavaでスクリプトライブラリを作成し、Lotusスクリプトエージェントから呼び出しました。

以下はコードです:

             //importing the required libraries
               import lotus.domino.*;
               import java.math.BigInteger;

              public class CalcProofNo
              {
              BigInteger BD_97 = new BigInteger("97");
              BigInteger BD_98 = new BigInteger("98");

              public  int calBBAN(String strBBAN) {
    //Gets the Basic Bank Account Number into BigInteger
    BigInteger BBAN = new BigInteger(strBBAN);

    //Calaculating Mod by dividing the Basic Bank Account Number by 97
    BBAN= BBAN.divideAndRemainder(BD_97)[1];

    //Subtracting 98 from the modulus
    BBAN = BD_98.subtract(BBAN);

    //Returning proof number in integer
    return BBAN.intValue();

              }    
         }

Lotus Scriptエージェントコード:

     Option Public
     Use "CalcProofNo"
     Uselsx "*javacon"

Dim javaSession As JAVASESSION
Dim javaUtil As Variant
Dim javaUtilClass As Variant

      Set javaSession = New JAVASESSION

'Getting defined Class in ScriptLibrary 
Set javaUtilClass = javaSession.GetClass("CalcProofNo")

'Creating object for it 
Set javaUtil =javaUtilClass.CreateObject() 

' passing parameters to method, calling the method using object.
strProofNumber =   Cstr(javaUtil.calBBAN(strBBAN))
于 2012-05-25T13:46:04.867 に答える
1

ここを参照してください:http://jsfromhell.com/classes/bignumber

于 2012-05-17T13:53:37.480 に答える