22桁の数字の割り算をしたいです。ロータス スクリプトで。
誰か教えてください。正しい結果が得られません。
例えば;
Dim num as Double;
Dim num1 を Double として。
数値 = 123456789989898976765;
num1 = num / 97;
しかし、num1で正しい結果が得られません。
22桁の数字の割り算をしたいです。ロータス スクリプトで。
誰か教えてください。正しい結果が得られません。
例えば;
Dim num as Double;
Dim num1 を Double として。
数値 = 123456789989898976765;
num1 = num / 97;
しかし、num1で正しい結果が得られません。
私の数学者を満足させるために、「正しい」答えを得ることは決してないだろうと言わなければなりません.除算は無限小数を持つ数を生成しますが、私はあなたが求めているものを得ると思います. ご希望の番号は次のとおりです。
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 で任意に大きな整数を計算するためのライブラリです。このライブラリをコードに含めることができれば、間違いなくより経済的な方法です。
これらのいずれかが役立つことを願っています。
問題は、除算に浮動小数点数を使用しているため、正確な結果が得られないことです。Lotusscript は float 以外の大きな数をサポートしていないため、計算を行う別の方法を見つける必要があります。たとえば、コードを Java で記述できる場合は、大きな数をより適切にサポートできます。または、別の例が示すように、これを JavaScript でも処理できるようです。
この問題を解決するために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))
ここを参照してください:http://jsfromhell.com/classes/bignumber