【问题标题】:Perform division of a 22 digit number in lotus script在莲花脚本中执行 22 位数字的除法
【发布时间】:2012-05-17 13:22:00
【问题描述】:

我想执行一个 22 位数字的除法。在莲花脚本中。

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

例如;

dim num 为 Double;

将 num1 调暗为 Double;

num=123456789989898976765;

num1 = 数字 / 97;

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

【问题讨论】:

    标签: javascript lotus-notes lotusscript lotus-formula


    【解决方案1】:

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

    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 中使用任意大整数进行数学运算的库。如果您可以将此库包含到您的代码中,那绝对是更经济的方式。

    我希望其中之一对您有所帮助。

    【讨论】:

    • 并使用 LS2J 从 LotusScript 调用 Java 函数。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        我用 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();
        
                      }    
                 }
        

        莲花脚本代理代码:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-21
          • 1970-01-01
          • 2013-07-03
          • 1970-01-01
          • 1970-01-01
          • 2020-11-23
          相关资源
          最近更新 更多