in hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Output.java [743:813]
public void writeDouble(double value)
throws IOException {
int offset = _offset;
byte[] buffer = _buffer;
if (SIZE <= offset + 16) {
flushBuffer();
offset = _offset;
}
int intValue = (int) value;
if (intValue == value) {
if (intValue == 0) {
buffer[offset++] = (byte) BC_DOUBLE_ZERO;
_offset = offset;
return;
} else if (intValue == 1) {
buffer[offset++] = (byte) BC_DOUBLE_ONE;
_offset = offset;
return;
} else if (-0x80 <= intValue && intValue < 0x80) {
buffer[offset++] = (byte) BC_DOUBLE_BYTE;
buffer[offset++] = (byte) intValue;
_offset = offset;
return;
} else if (-0x8000 <= intValue && intValue < 0x8000) {
buffer[offset + 0] = (byte) BC_DOUBLE_SHORT;
buffer[offset + 1] = (byte) (intValue >> 8);
buffer[offset + 2] = (byte) intValue;
_offset = offset + 3;
return;
}
}
int mills = (int) (value * 1000);
if (0.001 * mills == value) {
buffer[offset + 0] = (byte) (BC_DOUBLE_MILL);
buffer[offset + 1] = (byte) (mills >> 24);
buffer[offset + 2] = (byte) (mills >> 16);
buffer[offset + 3] = (byte) (mills >> 8);
buffer[offset + 4] = (byte) (mills);
_offset = offset + 5;
return;
}
long bits = Double.doubleToLongBits(value);
buffer[offset + 0] = (byte) 'D';
buffer[offset + 1] = (byte) (bits >> 56);
buffer[offset + 2] = (byte) (bits >> 48);
buffer[offset + 3] = (byte) (bits >> 40);
buffer[offset + 4] = (byte) (bits >> 32);
buffer[offset + 5] = (byte) (bits >> 24);
buffer[offset + 6] = (byte) (bits >> 16);
buffer[offset + 7] = (byte) (bits >> 8);
buffer[offset + 8] = (byte) (bits);
_offset = offset + 9;
}