2012-05-17 31 views
1

我想執行22位數字的分割。在蓮花腳本。在蓮花腳本中進行22位數字的分割

任何人都可以請告訴我該怎麼做嗎?我沒有得到正確的結果。

例如;

dim num as Double;

dim num1 as Double;

num = 123456789989898976765;

num1 = num/97;

但我沒有在num1中得到正確的結果。

回答

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 

這是在錯誤的答案是什麼結果。

因爲我不知道蓮花腳本環境,我會做兩件事;首先,給你一些代碼,將解決這方面的問題,比如:

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 

這是不準確的,但可能足夠接近,對?你如何將更大的數字分割成片段而不會失去精確度,這是你的兩倍。 (提示:使用字符串)

其次,我將指出BigInt.js,這是一個在JavaScript中用任意大整數進行數學運算的庫。如果你可以將這個庫加入你的代碼中,那肯定是更經濟的方法。

我希望這些幫助之一。

+0

並使用LS2J從LotusScript中調用Java函數。 –

2

問題是您正在使用浮點數作爲除法,這將不會產生準確的結果。 Lotusscript不支持除浮點數以外的大數字,所以你應該找到另一種方法來計算。例如,如果您可以使用Java編寫代碼,則可以更好地支持大數字。或者,如另一個示例所示,您顯然也可以在JavaScript中處理此問題。

1

我用Java寫了一個腳本庫來解決這個問題,稱那是從我的蓮花腳本代理:

下面是代碼:

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