在LibreOffice BASIC

时间:2017-11-20 00:27:23

标签: libreoffice basic

我正在尝试操作数字的MOD,但它返回溢出数据类型。

此操作有效:

VariableDouble = 2147483647 - (97 * (2147483647 \ 97))
MsgBox VariableDouble

此操作返回错误:

VariableDouble = 2147483648 - (97 * (2147483648 \ 97))
MsgBox VariableDouble

不应该是大于Long的双数据类型吗?当然,变量声明如下:Dim VariableDouble As Double

如果我使用内置运算符MOD:a MOD b

,则会发生相同的情况

我需要使用10位数字进行操作。有没有办法使用BASIC做到这一点?发生了什么事?

2 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,使用迭代的bucle [部分]创建自己的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操作系统,所以不会预装Python)。

答案 1 :(得分:1)

来自https://wiki.openoffice.org/wiki/Using_Python_on_Windows:“如果您不自定义安装,则在最新版本上默认安装Python-UNO网桥。”所以对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