Hier meine beiden kleinen Funktionen:
Dezimalzahl in Bruch umwandeln
#include-once
#include <Array.au3>
Func _DezimalzahlInBruch ($fDezimal, $bKuerzen = True)
Local $aVorkomma[2], $aNachkomma[2], $aBruch[2]
$aZahl = StringSplit($fDezimal, "", 2);StringLen($fDezimal) = UBound($aZahl)-1
[/autoit] [autoit][/autoit] [autoit]If StringInStr($fDezimal, ",") Then StringReplace($fDezimal, ",", ".", 1);optional: Ersetzung eines Dezimalkommas durch einen Dezimalpunkt
$iPunkt = _ArraySearch($aZahl, ".")
If $iPunkt < 0 Then SetError(1);Zahl ohne Dezimaltrennzeichen
For $i = 0 To $iPunkt-1
$aVorkomma[1] &= $aZahl[$i]
Next
$aVorkomma[0] = StringLen($aVorkomma[1])
$aNachkomma[0] = StringLen($fDezimal)-($iPunkt+1);Länge der Nachkommazahl
For $i = $iPunkt+1 To UBound($aZahl)-1
$aNachkomma[1] &= $aZahl[$i];Nachkommazahl
Next
$aBruch[0] = $aNachkomma[1];Dividend
$aBruch[1] = 10^$aNachkomma[0];= 10^StringLen($aNachkomma[1]);Divisor
Select
Case $aVorkomma[0] > 1 Or $aVorkomma[1] > 0
$aBruch[0] += $aVorkomma[1] * $aBruch[1]
If $bKuerzen = False Then
Return $aBruch
Else
ContinueCase
EndIf
Case Else
Return _BruchKuerzen ($aBruch[0], $aBruch[1])
EndSelect
EndFunc
Bruch kürzen
Func _BruchKuerzen ($iDividend, $iDivisor)
Local $aBruch[2] = [$iDividend, $iDivisor], $aTeiler[2] = [2, 5]
Do
For $i = 0 To 1
If Not Mod($aBruch[0], $aTeiler[$i]) And Not Mod($aBruch[1], $aTeiler[$i]) Then
For $n = 0 To 1
$aBruch[$n] = $aBruch[$n] / $aTeiler[$i]
Next
EndIf
Next
Until (Mod($aBruch[0], $aTeiler[0]) Or Mod($aBruch[1], $aTeiler[0])) And (Mod($aBruch[0], $aTeiler[1]) Or Mod($aBruch[1], $aTeiler[1]))
Return $aBruch
EndFunc
Beispielskript
Global $aErgebnis[2], $fDezimal = 18.8
[/autoit] [autoit][/autoit] [autoit]$aErgebnis = _DezimalzahlInBruch ($fDezimal, False)
ConsoleWrite($fDezimal & " = " & $aErgebnis[0] & " / " & $aErgebnis[1] & @CRLF)
$aErgebnis = _DezimalzahlInBruch ($fDezimal, True)
ConsoleWrite($fDezimal & " = " & $aErgebnis[0] & " / " & $aErgebnis[1] & @CRLF)
Exit