feat: use half up instead of floor

This commit is contained in:
2025-07-22 00:30:53 +08:00
parent 0d6eed0568
commit df4fc050b5
5 changed files with 14 additions and 14 deletions

View File

@@ -19,10 +19,10 @@ public class BirthdayParadox {
public static BigDecimal p(int n) {
BigDecimal p = BigDecimal.ONE;
for (int i = 1; i < n; i++) {
p = p.multiply(BigDecimal.ONE.subtract(BigDecimal.valueOf(i).divide(BigDecimal.valueOf(365), 100, RoundingMode.FLOOR)));
p = p.multiply(BigDecimal.ONE.subtract(BigDecimal.valueOf(i).divide(BigDecimal.valueOf(365), 100, RoundingMode.HALF_UP)));
}
if (!p.equals(BigDecimal.ONE)) {
p = p.divide(BigDecimal.ONE, 100, RoundingMode.FLOOR);
p = p.divide(BigDecimal.ONE, 100, RoundingMode.HALF_UP);
}
return BigDecimal.ONE.subtract(p);
}

View File

@@ -10,7 +10,7 @@ import java.math.RoundingMode;
public class ChudnovskyAlgorithm {
public static void main(String[] args) {
// 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
// 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170680
System.out.println(computePi());
}
@@ -26,10 +26,10 @@ public class ChudnovskyAlgorithm {
m = (k.pow(3).subtract(k.multiply(BigInteger.valueOf(16)))).multiply(m).divide(BigInteger.valueOf(i + 1).pow(3));
l = l.add(BigInteger.valueOf(545140134));
x = x.multiply(BigInteger.valueOf(-262537412640768000L));
s = s.add(new BigDecimal(m.multiply(l)).divide(new BigDecimal(x), 100, RoundingMode.FLOOR));
s = s.add(new BigDecimal(m.multiply(l)).divide(new BigDecimal(x), 100, RoundingMode.HALF_UP));
k = k.add(BigInteger.valueOf(12));
}
return c.divide(s, 100, RoundingMode.FLOOR);
return c.divide(s, 100, RoundingMode.HALF_UP);
}
}

View File

@@ -6,7 +6,7 @@ import java.math.RoundingMode;
public class EulerNumber {
public static void main(String[] args) {
// 2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664238
// 2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274
System.out.println(e());
}
@@ -15,7 +15,7 @@ public class EulerNumber {
BigDecimal f = BigDecimal.valueOf(1);
for (long i = 1; i < 1000; i++) {
f = f.multiply(BigDecimal.valueOf(i));
e = e.add(BigDecimal.ONE.divide(f, 100, RoundingMode.FLOOR));
e = e.add(BigDecimal.ONE.divide(f, 100, RoundingMode.HALF_UP));
}
return e;
}

View File

@@ -6,7 +6,7 @@ import java.math.RoundingMode;
public class LeibnizFormula {
public static void main(String[] args) {
// 3.1415925535897932384628933832795028810721693993752011334749445868976601562867023677686597593566430148
// 3.1415925535897932384628933832795028810721693993752011334749445868976601562867023677686597593566436288
System.out.println(pi());
}
@@ -14,7 +14,7 @@ public class LeibnizFormula {
BigDecimal p = BigDecimal.ZERO;
for (long i = 0; i < 10000000; i++) {
BigDecimal v = BigDecimal.ONE.divide(BigDecimal.valueOf(i * 2 + 1), 100, RoundingMode.FLOOR);
BigDecimal v = BigDecimal.ONE.divide(BigDecimal.valueOf(i * 2 + 1), 100, RoundingMode.HALF_UP);
if (i % 2 == 0) {
p = p.add(v);
} else {
@@ -22,6 +22,6 @@ public class LeibnizFormula {
}
}
return p.multiply(BigDecimal.valueOf(4)).divide(BigDecimal.ONE, 100, RoundingMode.FLOOR);
return p.multiply(BigDecimal.valueOf(4)).divide(BigDecimal.ONE, 100, RoundingMode.HALF_UP);
}
}

View File

@@ -6,7 +6,7 @@ import java.math.RoundingMode;
public class WallisProduct {
public static void main(String[] args) {
// 3.1415925750499739534746260502048989270653181072075621931977986489848855062212872415726332946132240849
// 3.1415925750499739534746260502048989270653181072075621931977986489848855062212872415726332946168657188
System.out.println(pi());
}
@@ -15,11 +15,11 @@ public class WallisProduct {
for (long i = 1; i < 10000000; i++) {
BigDecimal doubleI = BigDecimal.valueOf(i * 2);
p = p.multiply(
doubleI.divide(doubleI.subtract(BigDecimal.ONE), 100, RoundingMode.FLOOR)
doubleI.divide(doubleI.subtract(BigDecimal.ONE), 100, RoundingMode.HALF_UP)
).multiply(
doubleI.divide(doubleI.add(BigDecimal.ONE), 100, RoundingMode.FLOOR)
doubleI.divide(doubleI.add(BigDecimal.ONE), 100, RoundingMode.HALF_UP)
);
p = p.divide(BigDecimal.ONE, 100, RoundingMode.FLOOR);
p = p.divide(BigDecimal.ONE, 100, RoundingMode.HALF_UP);
}
return p;
}