Julia ist eine Allzwecksprache, die für die meisten Programmieraufgaben verwendet werden kann. In der Praxis liegen die wichtigsten Anwendungsfälle jedoch meist im Ingenieurwesen und in der Wissenschaft. Schnelle, vielseitige und ausgefeilte numerische Berechnungen stehen im Zentrum des Designs.
Eine Ganzzahl ist eine „runde“ Zahl ohne Dezimalpunkt.
Im Konzept Grundlagen haben wir gesehen, dass ein Ganzzahlwert einer Variablen zugewiesen werden kann, ohne einen Typ anzugeben.
Zur besseren Lesbarkeit können Unterstriche als Zifferntrennzeichen verwendet werden. Sie werden vom Compiler ignoriert.
julia> x = 3
3
julia> typeof(x)
Int64
julia> large_number = 1_234_567_890
1234567890
Es überrascht nicht, dass Gleitkommazahlen einen Dezimalpunkt und einen Nachkommateil haben.
julia> f = 3.45
3.45
julia> typeof(f)
Float64
Natürlich wird auch die wissenschaftliche Notation unterstützt.
julia> avogadro = 6.02e23
6.02e23
Die Maximal- und Minimalwerte könnten dich allerdings überraschen:
julia> typemax(Float64)
Inf
julia> typemin(Float64)
-Inf
Unendlich ist ein gültiger Wert!
Wie im Konzept Grundlagen besprochen, funktionieren arithmetische Operatoren meist genauso wie die normale Arithmetik, die man Kindern beibringt.
Beachte, dass die Potenzierung ^ verwendet, nicht ** (beides ist in anderen Sprachen üblich).
2 + 3 # 5 (addition)
2 - 3 # -1 (subtraction)
2 * 3 # 6 (multiplication)
8 / 2 # 4.0 (division)
8 % 3 # 2 (remainder)
2 ^ 3 # 8 (exponentiation)
Ein paar Julia-spezifische Details sind jedoch eine Diskussion wert.
julia> x = 4.2
4.2
julia> 2 * x
8.4
julia> 2x
8.4
julia> 2.4x
10.08
Das mag überraschen.
Es ist immer möglich, * als Infix-Operator zu verwenden, wie in den meisten anderen Programmiersprachen.
Julia wurde jedoch von Menschen entworfen, die der Meinung sind, dass Code so weit wie möglich wie mathematische Gleichungen aussehen sollte.
Da Variablennamen mit einem Buchstaben beginnen müssen, wird eine Zahl (Ganzzahl oder Gleitkommazahl) vor dem Namen als implizite Multiplikation behandelt.
Wenn wir zum Beispiel die Oberfläche einer Kugel wollen, könnten wir statt 4 * pi * r * r Folgendes tun:
julia> surface(r) = 4π * r^2
surface (generic function with 1 method)
julia> surface(3)
113.09733552923255
Obwohl π eine eingebaute Konstante ist, ist es auch ein (griechischer) Buchstabe.
Der Parser braucht daher trotzdem ein explizites *, um π von r zu trennen.
Die Verwendung von / als Infix-Operator liefert immer ein Gleitkommaergebnis, selbst bei Ganzzahlen als Eingabe.
Für die Ganzzahldivision gibt es mehr Möglichkeiten.
julia> 10 / 3 # floating-point division
3.3333333333333335
julia> div(10, 3) # integer division
3
julia> 10 ÷ 3 # synonym for div()
3
julia> 10 // 3 # rational number (fraction)
10//3
Die Funktion div() ist für die Ganzzahldivision, wobei das Ergebnis gegen null abgeschnitten wird: bei positiven Zahlen abwärts, bei negativen Zahlen aufwärts.
Als Synonym können wir den Infix-Operator ÷ verwenden, wieder mit dem Ziel, es mathematischer aussehen zu lassen.
Wenn du einen Editor verwendest, der Julia versteht, gib dies als \div ein und drücke dann die <Tab>-Taste.
Der Operator // geht über den Rahmen dieses Konzepts hinaus.
Vorerst können wir einfach sagen, dass das Ergebnis von // eine „rationale“ Zahl ist, die die meisten Leute Bruch nennen.
Das kann oft automatisch geschehen:
julia> x = 2 + 3.5
5.5
julia> typeof(x)
Float64
Wir haben eine Int64 zu einer Float64 addiert und ein Float64-Ergebnis erhalten.
Tatsächlich wurde die Ganzzahl stillschweigend in eine Float64 umgewandelt, bevor die Addition durchgeführt wurde.
Gleitkomma-zu-Ganzzahl-Umwandlungen sind zwangsläufig komplizierter. Was möchtest du mit allem nach dem Dezimalpunkt machen?
round() wandelt in die nächstgelegene ganze Zahl um, wobei bei Gleichstand (wie bei 4.5) auf die nächstgelegene gerade ganze Zahl gerundet wird.floor() rundet ab, ceil() rundet auf, trunc() rundet gegen null.Int32(), schlägt mit einem InexactError fehl.Standardmäßig geben diese Funktionen jedoch nicht den Ganzzahltyp zurück, den du vielleicht wolltest. Der gewünschte Ausgabetyp kann angegeben werden.
julia> round(4.5)
4.0
julia> ceil(Int, 4.3)
5
Das Runden auf eine bestimmte Anzahl von Nachkommastellen ist auch mit dem Schlüsselwort digits möglich.
julia> round(π, digits=10)
3.1415926536
Das wirft doch sicher einfach einen Fehler? Tatsächlich ist die Situation nicht so einfach.
Die Ganzzahldivision mit ÷ oder // führt, wie du vielleicht erwartest, zu einem Fehler.
Die Gleitkommadivision mit / verfolgt einen eher ingenieurmäßigen Ansatz als den üblichen Ansatz der Informatik:
julia> 2 / 0
Inf
julia> 0 / 0
NaN
Wie in einem vorherigen Abschnitt besprochen, ist Unendlich in Julia eine gültige Gleitkommazahl, dargestellt durch Inf.
Wenn der Zähler ebenfalls null ist, ist das Ergebnis mathematisch undefiniert.
Julia behandelt es dann als „keine Zahl“, dargestellt durch NaN.
Dein Freund Chandler will exotische Länder auf der ganzen Welt bereisen. Leider sind Chandlers Mathekünste nicht besonders gut. Er hat ziemlich Angst, auf seiner Reise von Wechselstuben abgezockt zu werden, und möchte, dass du ihm einen Währungsrechner baust. Hier sind seine Vorgaben für die App:
Erstelle die Funktion exchange_money() mit 2 Parametern:
budget: Der Geldbetrag, den du umtauschen möchtest.exchange_rate: Der Betrag in der heimischen Währung, der einer Einheit der Fremdwährung entspricht.Diese Funktion soll den Wert der umgetauschten Währung zurückgeben.
Hinweis: Wenn deine Währung USD ist und du USD mit einem Wechselkurs von 1.20 in EUR umtauschen möchtest, dann gilt 1.20 USD == 1 EUR.
julia> exchange_money(127.5, 1.2)
106.25
Erstelle die Funktion get_change() mit 2 Parametern:
budget: Der Geldbetrag vor dem Umtausch.exchanging_value: Der Geldbetrag, der vom Budget abgezogen wird, um ihn umzutauschen.Diese Funktion soll den Geldbetrag zurückgeben, der vom Budget übrig bleibt.
julia> get_change(127.5, 120)
7.5
Erstelle die Funktion get_value_of_bills() mit 2 Parametern:
denomination: Der Wert eines einzelnen Scheins.number_of_bills: Die Gesamtzahl der Scheine.Diese Wechselstube handelt nur mit Bargeld in bestimmten Stückelungen. Der Gesamtbetrag, den du erhältst, muss durch den Wert eines „Scheins“ oder einer Einheit teilbar sein, wodurch ein Bruchteil oder Rest übrig bleiben kann. Deine Funktion soll nur den Gesamtwert der Scheine (ohne Bruchteile) zurückgeben, die die Wechselstube herausgeben würde. Leider darf die Wechselstube den Restbetrag/das Wechselgeld als zusätzlichen Bonus behalten.
julia> get_value_of_bills(5, 128)
640
Erstelle die Funktion get_number_of_bills() mit amount und denomination.
Diese Funktion soll die Anzahl der Geldscheine zurückgeben, die du innerhalb des gegebenen Betrags erhalten kannst. Anders gesagt: Wie viele ganze Scheine passen in den Ausgangsbetrag? Denk daran: Du kannst nur ganze Scheine erhalten, keine Bruchteile von Scheinen, also teile entsprechend. Im Endeffekt rundest du ab auf den nächsten ganzen Schein bzw. die nächste Stückelung.
julia> get_number_of_bills(127.5, 5)
25
Erstelle die Funktion get_leftover_of_bills() mit amount und denomination.
Diese Funktion soll den Restbetrag zurückgeben, der bei der gegebenen Stückelung der Scheine nicht von deinem Ausgangs_betrag_ herausgegeben werden kann. Es ist sehr wichtig zu wissen, wie viel die Wechselstube genau behalten darf.
julia> get_leftover_of_bills(127.5, 20)
7.5
Erstelle die Funktion exchangeable_value() mit budget, exchange_rate, spread und denomination.
Der Parameter spread ist der Prozentsatz, der als Umtauschgebühr genommen wird, angegeben als Ganzzahl.
Er muss in eine Dezimalzahl umgewandelt werden, indem du ihn durch 100 teilst.
Wenn 1.00 EUR == 1.20 USD gilt und der Spread 10 ist, beträgt der tatsächliche Gesamtwechselkurs 1.00 EUR == 1.32 USD, weil 10 % von 1.20 gleich 0.12 sind und diese zusätzliche Gebühr zum Umtausch hinzukommt.
Diese Funktion soll den maximalen Wert der neuen Währung nach Berechnung des Wechselkurses plus des Spreads zurückgeben. Denk daran, dass die Stückelung der Währung eine ganze Zahl ist und nicht unterteilt werden kann.
Hinweis: Der zurückgegebene Wert sollte ein Ganzzahltyp sein.
julia> exchangeable_value(127.25, 1.20, 10, 20)
80
julia> exchangeable_value(127.25, 1.20, 10, 5)
95
Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.