Ich habe letztens eine Taschenrechner-ähnliche Funktion geschaffen, die es mir erlaubt, einen String zu einem double zu machen.
Doch mir ist aufgefallen, dass bei der Division immer nicht-gewollte Kommastellen im e-2 Bereich erstellt werden.
Ich habe sogar mal BigDecimal benutzt, was aber irgendwie nichts gebracht hat... Nur die Division macht Probleme, der Rest macht alles gut. 8/2 = 4.02, 8*0.5 = 4.
Woran liegt das? (Ich habe sogar mal einfach statt
ausprobiert, was auch nichts bringt.
Doch mir ist aufgefallen, dass bei der Division immer nicht-gewollte Kommastellen im e-2 Bereich erstellt werden.
Ich habe sogar mal BigDecimal benutzt, was aber irgendwie nichts gebracht hat... Nur die Division macht Probleme, der Rest macht alles gut. 8/2 = 4.02, 8*0.5 = 4.
Woran liegt das? (Ich habe sogar mal einfach statt
Java:
part = "" + new BigDecimal(c[j-1]).divide(new BigDecimal(c[j+1])).doubleValue();
Java:
part = "" + new BigDecimal(8).divide(new BigDecimal(8)).doubleValue();
Java:
package Tools;
import java.math.BigDecimal;
public class Functions {
public static double returnResult(String s) {
s = "(" + s + ")";
char[] c = s.toCharArray();
int[] brPos = new int[c.length];
int bracket = 0;
int brackets = 0;
//get pos of brackets
for(int i = 0; i < c.length; i++) {
switch(c[i]) {
case '(': brPos[i] = 2 + bracket+10; bracket+=10; brackets++; break;
case ')': brPos[i] = 1 + bracket; bracket-=10; brackets++; break;
default: brPos[i] = 0; break;
}
}
//System.out.println();
boolean parsesBr = true;
String[] res = new String[brackets/2];
String part = "";
int amountOBrs = 0;
for(int i = c.length-1; i >= 0; i--) {
if(brPos[i] %10 == 2) {
part = "";
//String of brackets
parsesBr = true;
int br = brPos[i];
for(int j = i+1; parsesBr; j++) {
//System.out.println(part);
if(brPos[j]+1 == br) parsesBr = false;
else part += c[j];
}
res[amountOBrs] = part;
amountOBrs++;
}
}
return Double.valueOf(calcBracket(res));
}
private static String calcBracket(String[] s) {
String[] c;
String part = "";
String replace = "";
String bracketsReplace = "";
int check = 0;
for(int i = 0; i < s.length; i++) {
bracketsReplace = s[i];
c = toStringArray(s[i]);
//System.out.println("restart");
//System.out.println();
//Loop till everything is calculated
Loop:
while(true) {
check = 0;
c = toStringArray(s[i]);
for(int j = 0; j < c.length; j++) {
switch(c[j]) {
case "^": {
part = "" + (Math.pow(Double.parseDouble("" + c[j-1]) , Double.parseDouble("" + c[j+1])));
replace = "" + c[j-1] + c[j] + c[j+1];
s[i] = s[i].replace(replace, part);
//System.out.println("^replace: " + replace + ", " + part + " " + s[i]);
check++;
break;
}
case "%": {
part = "" + Double.parseDouble("" + c[j-1]) / 100;
replace = "" + c[j-1] + c[j];
s[i] = s[i].replace(replace, part);
//System.out.println("%replace: " + replace + " " + part + " " + s[i]);
check++;
break;
}
}
}
if(check == 0) break Loop;
}
//System.out.println();
//Loop till everything is calculated
Loop:
while(true) {
check = 0;
c = toStringArray(s[i]);
for(int j = 0; j < c.length; j++) {
switch(c[j]) {
case "*": {
part = "" + new BigDecimal(c[j-1]).multiply(new BigDecimal(c[j+1])).doubleValue();
replace = "" + c[j-1] + c[j] + c[j+1];
s[i] = s[i].replace(replace, part);
//System.out.println("*replace: " + replace + ", " + part + " '" + s[i] + "'");
check++;
break;
}
case "/": {
//Hier ist wohl irgendwas falsch
part = "" + new BigDecimal(c[j-1]).divide(new BigDecimal(c[j+1])).doubleValue();
replace = "" + c[j-1] + c[j];
s[i] = s[i].replace(replace, part);
//System.out.println("/replace: " + replace + " " + part + " " + s[i]);
check++;
break;
}
}
}
if(check == 0) break Loop;
}
//Loop till everything is calculated
Loop:
while(true) {
check = 0;
c = toStringArray(s[i]);
for(int j = 0; j < c.length; j++) {
switch(c[j]) {
case "+": {
part = "" + (Double.parseDouble("" + c[j-1]) + Double.parseDouble("" + c[j+1]));
replace = "" + c[j-1] + c[j] + c[j+1];
s[i] = s[i].replace(replace, part);
//System.out.println("+replace: " + replace + ", " + part + " '" + s[i] + "'");
check++;
break;
}
case "-": {
part = "" + (Double.parseDouble("" + c[j-1]) - Double.parseDouble("" + c[j+1]));
replace = "" + c[j-1] + c[j] +c[j+1];
s[i] = s[i].replace(replace, part);
//System.out.println("-replace: " + replace + " " + part + " " + s[i]);
check++;
break;
}
}
}
if(check == 0) break Loop;
}
//replace the String in the other Brackets
for(int j = 0; j < s.length; j++) {
if(j != i) {
//System.out.println("BrReplace: " + s[j] + ", " + bracketsReplace + ", " + s[i]);
s[j] = s[j].replace("(" + bracketsReplace + ")", s[i]);
//System.out.println(s[j]);
}
}
}
//System.out.println(s[s.length-1]);
return s[s.length-1];
}
public static String[] toStringArray(String s) {
//System.out.println(s);
char[] c = s.toCharArray();
String[] ar = new String[c.length];
int j = 0;
int k = 0;
for(int i = 0; j < c.length; j++) {
//System.out.println(j + ":" + i);
if(i < c.length) ar[i] = "";
while(j < c.length && (Character.isDigit(c[j]) | c[j] == '.')) {
ar[i] += c[j];
j++;
//System.out.println(ar[i]);
}
i++;
if(i < c.length) ar[i] = "";
if(j < c.length && !Character.isDigit(c[j]) /**&& c[i] != '(' && c[i] != ')'**/) {
ar[i] += c[j];
//System.out.println(ar[i]);
i++;
}
k = i;
//System.out.println(i);
}
String[] res = new String[k];
for(int i = 0; i < k; i++) {
res[i] = ar[i];
//System.out.println("a:" + ar[i]);
}
return res;
}
}
Zuletzt bearbeitet: