Windows Forms计算器右侧按钮集成Math类技术求助
Hey there! I get where you're stuck—relying on parsing the display string works great for basic arithmetic (your left-side buttons), but it falls apart when you need single-value operations like square roots, sine, or logarithms. Let's refactor your code to integrate the Math class smoothly.
First: Refactor Your Value Storage
Instead of only using the display text box's string for calculations, add a class-level variable to track the current numeric value. This makes single-value operations way cleaner:
// Add this at the top of your form class private double _currentValue = 0; private bool _isNewOperation = true; // To handle resetting the display after an operation
Update your number/decimal buttons to update both the display and _currentValue when clicked. For example, a "1" button click:
private void btn1_Click(object sender, EventArgs e) { if (_isNewOperation) { txtDisplay.Text = ""; _isNewOperation = false; } txtDisplay.Text += "1"; // Parse the display to update our value (handle parsing errors gracefully!) if (double.TryParse(txtDisplay.Text, out double newValue)) { _currentValue = newValue; } }
Second: Implement Math Class Operations for Right-Side Buttons
Each right-side button will directly operate on _currentValue using methods from the Math class, then update the display. Here are common examples:
Square Root Button
private void btnSquareRoot_Click(object sender, EventArgs e) { if (_currentValue >= 0) { _currentValue = Math.Sqrt(_currentValue); txtDisplay.Text = _currentValue.ToString(); _isNewOperation = true; // Next input starts a new number } else { txtDisplay.Text = "Error"; _isNewOperation = true; } }
Sine Button (Note: Math.Sin uses radians!)
private void btnSin_Click(object sender, EventArgs e) { // Convert degrees to radians if your calculator uses degree input double radians = Math.PI * _currentValue / 180; _currentValue = Math.Sin(radians); txtDisplay.Text = _currentValue.ToString("N4"); // Format to 4 decimal places _isNewOperation = true; }
Natural Logarithm Button
private void btnLn_Click(object sender, EventArgs e) { if (_currentValue > 0) { _currentValue = Math.Log(_currentValue); txtDisplay.Text = _currentValue.ToString("N4"); _isNewOperation = true; } else { txtDisplay.Text = "Error"; _isNewOperation = true; } }
Third: Keep Your Existing Expression Logic Working
If you still need to handle multi-operand expressions (like 2 + 3 * 4), you can keep your original string-parsing logic for those left-side operation buttons. Just make sure that after evaluating an expression, you update _currentValue with the result and set _isNewOperation = true.
Pro Tips
- Always add error handling (like the negative square root check above) to avoid crashes.
- Use
double.TryParseinstead ofdouble.Parseto handle invalid input gracefully. - For operations like tangent, remember to handle values where the function is undefined (e.g., 90 degrees for tan).
内容的提问来源于stack exchange,提问作者GMTPB

