二进制转十进制时输出不可预测,求Java代码调试协助
Hey there! Let's dig into why your conversion code is giving wonky results—there are a couple of key issues throwing things off, and I’ll walk you through fixing them.
The Main Problem: Character-to-Number Conversion
When you use c[i] * temp, you’re not multiplying by the binary digit (0 or 1) you think you are. c[i] is a char type, so its value is the ASCII code of the character:
- The character
'0'has an ASCII value of 48 - The character
'1'has an ASCII value of 49
Instead of calculating 1 * 2^i or 0 * 2^i, you’re doing 49 * 2^i or 48 * 2^i—that’s why your output is completely off! To fix this, convert the character to its actual numeric value using c[i] - '0' (ASCII values for digits are consecutive, so subtracting '0' gives you the integer 0 or 1).
Secondary Issue: Precision with Math.pow()
Math.pow() returns a double type, which can lose precision when dealing with large exponents (like 2^30 or higher). For integer-based binary conversion, it’s way more reliable to use integer arithmetic (like multiplying by 2 each loop) to keep calculations exact.
Corrected Code
Here’s your code with fixes and improvements:
import java.util.Scanner; public class BinaryConverter { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String binaryInput = scanner.nextLine(); char[] binaryChars = binaryInput.toCharArray(); int decimalValue = 0; int powerOfTwo = 1; // Starts at 2^0 for the rightmost digit // Optional: Validate input is a valid binary string for (char ch : binaryChars) { if (ch != '0' && ch != '1') { System.out.println("Oops! That's not a valid binary string. Please enter only 0s and 1s."); scanner.close(); return; } } // Iterate from right to left (least significant to most significant bit) for (int i = binaryChars.length - 1; i >= 0; i--) { int digit = binaryChars[i] - '0'; // Convert char to integer 0/1 decimalValue += digit * powerOfTwo; System.out.println("Char: " + binaryChars[i] + " | Digit: " + digit + " | 2^" + (binaryChars.length - 1 - i) + ": " + powerOfTwo + " | Current Total: " + decimalValue); powerOfTwo *= 2; // Move to the next higher power of 2 } System.out.println("Final Decimal Result: " + decimalValue); scanner.close(); } }
Key Changes Explained
binaryChars[i] - '0': Converts the character to its actual numeric value (0 or 1) instead of using ASCII codes.- Integer-based power calculation:
powerOfTwostarts at 1 (2^0) and multiplies by 2 each loop—this avoids precision errors fromMath.pow(). - Input validation: Adds a check to ensure the user only enters 0s and 1s, preventing unexpected behavior from invalid inputs.
Give this a try, and your binary-to-decimal conversions should work exactly as expected!
内容的提问来源于stack exchange,提问作者user8623671

