Skip to content

Commit 2e222bd

Browse files
cursoragentsimbo1905
andcommitted
Issue #119 Add runnable numeric design choice examples
Co-authored-by: simbo1905 <simbo1905@60hertz.com>
1 parent 7186065 commit 2e222bd

File tree

2 files changed

+143
-0
lines changed

2 files changed

+143
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package jdk.sandbox.java.util.json;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.math.BigDecimal;
6+
import java.math.BigInteger;
7+
import java.util.logging.Logger;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
public class DesignChoicesNumberExamplesTest {
12+
private static final Logger LOGGER = Logger.getLogger(DesignChoicesNumberExamplesTest.class.getName());
13+
14+
@Test
15+
void parseHighPrecisionNumberIsLosslessViaToString() {
16+
LOGGER.info("Executing parseHighPrecisionNumberIsLosslessViaToString");
17+
18+
var text = "3.141592653589793238462643383279";
19+
var n = (JsonNumber) Json.parse(text);
20+
21+
assertThat(n.toString()).isEqualTo(text);
22+
assertThat(new BigDecimal(n.toString())).isEqualByComparingTo(new BigDecimal(text));
23+
}
24+
25+
@Test
26+
void convertingToDoubleIsPotentiallyLossy() {
27+
LOGGER.info("Executing convertingToDoubleIsPotentiallyLossy");
28+
29+
var text = "3.141592653589793238462643383279";
30+
var n = (JsonNumber) Json.parse(text);
31+
32+
var lossless = new BigDecimal(n.toString());
33+
var lossy = new BigDecimal(Double.toString(n.toDouble()));
34+
35+
assertThat(lossy).isNotEqualByComparingTo(lossless);
36+
}
37+
38+
@Test
39+
void parseExponentFormToBigIntegerExactWorks() {
40+
LOGGER.info("Executing parseExponentFormToBigIntegerExactWorks");
41+
42+
var n = (JsonNumber) Json.parse("1.23e2");
43+
BigInteger bi = new BigDecimal(n.toString()).toBigIntegerExact();
44+
45+
assertThat(bi).isEqualTo(BigInteger.valueOf(123));
46+
}
47+
48+
@Test
49+
void bigDecimalToJsonNumberRequiresChoosingATextPolicy() {
50+
LOGGER.info("Executing bigDecimalToJsonNumberRequiresChoosingATextPolicy");
51+
52+
var thousand = new BigDecimal("1000");
53+
54+
var plain = JsonNumber.of(thousand.toPlainString());
55+
assertThat(plain.toString()).isEqualTo("1000");
56+
57+
var scientific = JsonNumber.of(new BigDecimal("1E+3").toString());
58+
assertThat(scientific.toString()).isEqualTo("1E+3");
59+
}
60+
61+
@Test
62+
void lexicalPreservationDiffersFromNumericNormalization() {
63+
LOGGER.info("Executing lexicalPreservationDiffersFromNumericNormalization");
64+
65+
var a = (JsonNumber) Json.parse("1e2");
66+
var b = (JsonNumber) Json.parse("100");
67+
68+
// lexical forms differ
69+
assertThat(a.toString()).isEqualTo("1e2");
70+
assertThat(b.toString()).isEqualTo("100");
71+
72+
// but numeric values compare equal when canonicalized explicitly
73+
assertThat(new BigDecimal(a.toString())).isEqualByComparingTo(new BigDecimal(b.toString()));
74+
}
75+
}
76+
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package jdk.sandbox.java.util.json.examples;
2+
3+
import jdk.sandbox.java.util.json.Json;
4+
import jdk.sandbox.java.util.json.JsonNumber;
5+
6+
import java.math.BigDecimal;
7+
import java.math.BigInteger;
8+
9+
/**
10+
* Standalone examples demonstrating numeric design choices.
11+
*
12+
* <p>
13+
* This file mirrors the examples in {@code DESIGN_CHOICES.md}.
14+
*/
15+
public final class DesignChoicesExamples {
16+
17+
public static void main(String[] args) {
18+
System.out.println("=== Numeric design choices examples ===\n");
19+
20+
parseToBigDecimalLossless();
21+
parseToBigIntegerExact();
22+
bigDecimalToJsonNumberChooseTextPolicy();
23+
lexicalPreservationNotNormalization();
24+
25+
System.out.println("\n=== All examples completed successfully! ===");
26+
}
27+
28+
public static BigDecimal parseToBigDecimalLossless() {
29+
var n = (JsonNumber) Json.parse("3.141592653589793238462643383279");
30+
var bd = new BigDecimal(n.toString());
31+
System.out.println("lossless BigDecimal: " + bd.toPlainString());
32+
return bd;
33+
}
34+
35+
public static BigInteger parseToBigIntegerExact() {
36+
var n = (JsonNumber) Json.parse("1.23e2");
37+
var bi = new BigDecimal(n.toString()).toBigIntegerExact();
38+
System.out.println("exact BigInteger: " + bi);
39+
return bi;
40+
}
41+
42+
public static JsonNumber bigDecimalToJsonNumberChooseTextPolicy() {
43+
var bd = new BigDecimal("1000");
44+
45+
var plain = JsonNumber.of(bd.toPlainString());
46+
System.out.println("BigDecimal.toPlainString() -> JsonNumber: " + plain);
47+
48+
var scientific = JsonNumber.of(new BigDecimal("1E+3").toString());
49+
System.out.println("BigDecimal.toString() -> JsonNumber: " + scientific);
50+
51+
return plain;
52+
}
53+
54+
public static boolean lexicalPreservationNotNormalization() {
55+
var a = (JsonNumber) Json.parse("1e2");
56+
var b = (JsonNumber) Json.parse("100");
57+
58+
System.out.println("a.toString(): " + a);
59+
System.out.println("b.toString(): " + b);
60+
System.out.println("same numeric value? " + new BigDecimal(a.toString()).compareTo(new BigDecimal(b.toString())));
61+
62+
return a.toString().equals(b.toString());
63+
}
64+
65+
private DesignChoicesExamples() {}
66+
}
67+

0 commit comments

Comments
 (0)