public static double modbusFloat(byte[] bits) { double rtn = 0; int flag = 1; if (bits.length == 4) { int E = bits[0] & 0x80; if (E > 0) { flag = -1; } E = ((bits[0] & 0x7F) << 1) + ((bits[1] & 0x80) >> 7); // 0x41360000 0 10000010 01101100000000000000000 double M10 = 0.0; for (int i = 1; i <= 7; i++) { M10 += (bits[1] >> (7 - i) & 0x01) * Math.pow(2, -1 * i); } for (int i = 1; i <= 8; i++) { M10 += (bits[2] >> (8 - i) & 0x01) * Math.pow(2, -1 * (i + 7)); } for (int i = 1; i <= 8; i++) { M10 += (bits[3] >> (8 - i) & 0x01) * Math.pow(2, -1 * (i + 15)); } String data = "" + (1.0 + M10); double dVal = Double.parseDouble(data); rtn = flag * dVal * (Math.pow(2, E - 127)); } // 00110011001100110100000000010011 return rtn; }