Skip to content

Commit 6420e13

Browse files
committed
fix write float/double
1 parent 615c858 commit 6420e13

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

src/main/java/com/jsoniter/output/StreamImplNumber.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,15 @@ public static final void writeFloat(JsonStream stream, float val) throws IOExcep
219219
stream.write('-');
220220
val = -val;
221221
}
222+
if (val > 0x4ffffff) {
223+
stream.writeRaw(Float.toString(val));
224+
return;
225+
}
222226
int precision = 6;
223227
int exp = 1000000; // 6
224-
long lval = (long)val;
225-
stream.writeVal(lval);
226-
long fval = (long)((val - lval) * exp);
228+
long lval = (long)(val * exp + 0.5);
229+
stream.writeVal(lval / exp);
230+
long fval = lval % exp;
227231
if (fval == 0) {
228232
return;
229233
}
@@ -245,11 +249,15 @@ public static final void writeDouble(JsonStream stream, double val) throws IOExc
245249
val = -val;
246250
stream.write('-');
247251
}
252+
if (val > 0x4ffffff) {
253+
stream.writeRaw(Double.toString(val));
254+
return;
255+
}
248256
int precision = 6;
249257
int exp = 1000000; // 6
250-
long lval = (long)val;
251-
stream.writeVal(lval);
252-
long fval = (long)((val - lval) * exp);
258+
long lval = (long)(val * exp + 0.5);
259+
stream.writeVal(lval / exp);
260+
long fval = lval % exp;
253261
if (fval == 0) {
254262
return;
255263
}

src/test/java/com/jsoniter/output/TestNative.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,21 @@ public void test_float3() throws IOException {
115115
}
116116

117117
public void test_big_float() throws IOException {
118-
stream.writeVal(83886082f);
118+
stream.writeVal((float)0x4ffffff);
119119
stream.close();
120120
assertEquals("83886080", baos.toString());
121121
}
122122

123123
public void test_double() throws IOException {
124-
stream.writeVal(0.00001d);
124+
stream.writeVal(1.001d);
125125
stream.close();
126-
assertEquals("0.00001", baos.toString());
126+
assertEquals("1.001", baos.toString());
127+
}
128+
129+
public void test_large_double() throws IOException {
130+
stream.writeVal(Double.MAX_VALUE);
131+
stream.close();
132+
assertEquals("1.7976931348623157E308", baos.toString());
127133
}
128134

129135
public void test_boolean() throws IOException {

0 commit comments

Comments
 (0)