在 LibreOffice BASIC 中处理大量数据
Operate with large numbers in LibreOffice BASIC
我正在尝试操作一个数字的 MOD 但它 returns 溢出数据类型。
此操作有效:
VariableDouble = 2147483647 - (97 * (2147483647 \ 97))
MsgBox VariableDouble
本次操作returns错误:
VariableDouble = 2147483648 - (97 * (2147483648 \ 97))
MsgBox VariableDouble
Double 数据类型不应该大于 Long 数据类型吗?当然,变量声明如下:Dim VariableDouble As Double
。
如果我使用内置运算符 MOD 也会发生同样的情况:a MOD b
.
我需要对 10 位数字进行运算。有没有一种方法可以使用 BASIC 来做到这一点?发生了什么事?
我找到了一个解决方案,使我自己的 MOD 实现 [部分] 具有迭代功能。它有效——不过我没有使用长度大于 50 位的数字对其进行测试——所以这是代码:
Dim LargeNumber As Double
Dim result As Integer
Dim dividend As Integer
Dim index As Integer
For index = 1 To Len(LargeNumber)
dividend = result & Mid(LargeNumber, index, 1)
result = dividend Mod 97
Next
BASIC 似乎无法处理大数字,尽管它可以将大数字保存到变量中。另一种解决方案是从外部调用 Python(API 可以做到)。 Python 很棒,但是我需要为多个系统保持此数据库的可移植性(有些系统使用 Windows OS,因此不会预装 Python)。
来自 https://wiki.openoffice.org/wiki/Using_Python_on_Windows:"If you do not customize the installation, Python-UNO bridge is installed as default on recent version." 所以对 Python 的依赖应该是可移植的。
def big_numbers():
dividend = 12345678901234567890123456789012345678901234567890
divisor = 97
modulus = dividend % divisor
rounded_val = modulus * divisor
result = dividend - rounded_val
oDoc = XSCRIPTCONTEXT.getDocument() # the current Writer document
oVC = oDoc.getCurrentController().getViewCursor()
output = ("%d - (%d * (%d \ %d)) = %d\n" %
(dividend, divisor, dividend, divisor, result))
oDoc.getText().insertString(oVC, output, False)
g_exportedScripts = (big_numbers,)
请参阅 https://wiki.openoffice.org/wiki/Python_as_a_macro_language 了解如何 运行 此代码。
相关:https://forum.openoffice.org/en/forum/viewtopic.php?t=39854.
我正在尝试操作一个数字的 MOD 但它 returns 溢出数据类型。
此操作有效:
VariableDouble = 2147483647 - (97 * (2147483647 \ 97))
MsgBox VariableDouble
本次操作returns错误:
VariableDouble = 2147483648 - (97 * (2147483648 \ 97))
MsgBox VariableDouble
Double 数据类型不应该大于 Long 数据类型吗?当然,变量声明如下:Dim VariableDouble As Double
。
如果我使用内置运算符 MOD 也会发生同样的情况:a MOD b
.
我需要对 10 位数字进行运算。有没有一种方法可以使用 BASIC 来做到这一点?发生了什么事?
我找到了一个解决方案,使我自己的 MOD 实现 [部分] 具有迭代功能。它有效——不过我没有使用长度大于 50 位的数字对其进行测试——所以这是代码:
Dim LargeNumber As Double
Dim result As Integer
Dim dividend As Integer
Dim index As Integer
For index = 1 To Len(LargeNumber)
dividend = result & Mid(LargeNumber, index, 1)
result = dividend Mod 97
Next
BASIC 似乎无法处理大数字,尽管它可以将大数字保存到变量中。另一种解决方案是从外部调用 Python(API 可以做到)。 Python 很棒,但是我需要为多个系统保持此数据库的可移植性(有些系统使用 Windows OS,因此不会预装 Python)。
来自 https://wiki.openoffice.org/wiki/Using_Python_on_Windows:"If you do not customize the installation, Python-UNO bridge is installed as default on recent version." 所以对 Python 的依赖应该是可移植的。
def big_numbers():
dividend = 12345678901234567890123456789012345678901234567890
divisor = 97
modulus = dividend % divisor
rounded_val = modulus * divisor
result = dividend - rounded_val
oDoc = XSCRIPTCONTEXT.getDocument() # the current Writer document
oVC = oDoc.getCurrentController().getViewCursor()
output = ("%d - (%d * (%d \ %d)) = %d\n" %
(dividend, divisor, dividend, divisor, result))
oDoc.getText().insertString(oVC, output, False)
g_exportedScripts = (big_numbers,)
请参阅 https://wiki.openoffice.org/wiki/Python_as_a_macro_language 了解如何 运行 此代码。
相关:https://forum.openoffice.org/en/forum/viewtopic.php?t=39854.