Javascript 在lotus脚本中执行22位数字的除法

Javascript 在lotus脚本中执行22位数字的除法,javascript,lotus-notes,lotusscript,lotus-formula,Javascript,Lotus Notes,Lotusscript,Lotus Formula,我想在lotus脚本中执行22位数字的除法 谁能告诉我怎么做吗?我没有得到正确的结果 例如: dim num为双精度 暗num1为双精度 num=12345678998998976765 num1=num/97 但是我没有得到num1的正确结果。请看这里:请看这里:为了满足我身上的数学家,我必须告诉你,你永远不会得到“正确”的答案,除法产生一个有无限小数位的数字,但我想我得到了你想要的。您要的号码是: 但你得到的数字是: 这是由于该语言使用的数字格式不够精确。当你除法的时候,精度的损失不会发生,

我想在lotus脚本中执行22位数字的除法

谁能告诉我怎么做吗?我没有得到正确的结果

例如:

dim num为双精度

暗num1为双精度

num=12345678998998976765

num1=num/97


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

请看这里:

请看这里:

为了满足我身上的数学家,我必须告诉你,你永远不会得到“正确”的答案,除法产生一个有无限小数位的数字,但我想我得到了你想要的。您要的号码是:

但你得到的数字是:

这是由于该语言使用的数字格式不够精确。当你除法的时候,精度的损失不会发生,当你把常数赋给变量的时候,它会发生得更快。您要存储的号码是:

123 456 789 989 898 976 765
但您实际存储的数字是:

123 456 789 989 898 980 000
这就是导致错误答案的原因

由于我不了解Lotus脚本环境,我将做两件事;首先,给您一些代码来解决这个特定的问题,如下所示:

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());
然后,您可以根据自己的需要进行概括。此代码将除法拆分为数字存储格式可以处理的两个较小的除法,并将第一个除法的剩余部分添加到第二个除法中,从而生成以下结果:

1 272 750 412 266 999 760.463 917 7
这不确切,但可能足够近,对吧?如何在不降低精度的情况下将较大的数字分割成碎片,留给您两个问题。(提示:使用字符串)

其次,我将向您介绍一个库,用于在JavaScript中使用任意大的整数进行数学运算。如果您可以在代码中包含这个库,那么这肯定是更经济的方法


我希望其中一个能帮上忙。

为了让我的数学家满意,我必须告诉你,你永远不会得到“正确”的答案,除法产生一个有无限小数的数字,但我想我得到了你想要的。您要的号码是:

但你得到的数字是:

这是由于该语言使用的数字格式不够精确。当你除法的时候,精度的损失不会发生,当你把常数赋给变量的时候,它会发生得更快。您要存储的号码是:

123 456 789 989 898 976 765
但您实际存储的数字是:

123 456 789 989 898 980 000
这就是导致错误答案的原因

由于我不了解Lotus脚本环境,我将做两件事;首先,给您一些代码来解决这个特定的问题,如下所示:

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());
然后,您可以根据自己的需要进行概括。此代码将除法拆分为数字存储格式可以处理的两个较小的除法,并将第一个除法的剩余部分添加到第二个除法中,从而生成以下结果:

1 272 750 412 266 999 760.463 917 7
这不确切,但可能足够近,对吧?如何在不降低精度的情况下将较大的数字分割成碎片,留给您两个问题。(提示:使用字符串)

其次,我将向您介绍一个库,用于在JavaScript中使用任意大的整数进行数学运算。如果您可以在代码中包含这个库,那么这肯定是更经济的方法


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

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

问题是您使用浮点数进行除法,这将不会产生准确的结果。Lotusscript不支持浮点以外的大数,因此您可能应该找到另一种方法来进行计算。例如,如果您可以用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脚本代理代码:

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

我用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脚本代理代码:

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

使用LS2J从LotusScript调用Java函数,并使用LS2J从LotusScript调用Java函数。