在莲花脚本中执行22位数字的划分

时间:2012-05-17 13:22:00

标签: javascript lotus-notes lotusscript lotus-formula

我想进行22位数的分割。在莲花剧本。

任何人都可以告诉我该怎么做?我没有得到正确的结果。

例如;

dim num为Double;

dim num1为Double;

NUM = 123456789989898976765;

num1 = num / 97;

但我没有在num1中得到正确的结果。

4 个答案:

答案 0 :(得分: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环境,我会做两件事;首先,给你一些代码来解决这个特殊问题,如下所示:

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());

然后您可以进行概括以满足您的需求。此代码将分区拆分为数字存储格式CAN处理的两个较小的分区,并将第一个分区的剩余部分添加到第二个分区,从而产生以下结果:

1 272 750 412 266 999 760.463 917 7

哪个不准确,但可能足够接近,对吧?如何将较大的数字拆分成碎片而不会失去精确度,这就是你的两个问题。 (提示:使用字符串)

其次,我将指向BigInt.js,这是一个在JavaScript中使用任意大整数进行数学运算的库。如果您可以将此库包含在您的代码中,那么这绝对是更经济的方式。

我希望其中一个有所帮助。

答案 1 :(得分:2)

问题在于您使用浮点数进行除法,这不会产生准确的结果。 Lotusscript不支持浮点数以外的大数,所以你应该找到另一种方法来计算。例如,如果您可以用Java编写代码,那么您可以更好地支持大数字。或者,正如另一个例子所示,你也可以在javascript中处理这个问题。

答案 2 :(得分:1)

答案 3 :(得分: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 Agent代码:

     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))