Ciao a tutti,
sto impazzendo con una cosa di cui non riesco a capacitarmi (e che, se qualcuno non mi fornisce una spiegazione plausibile, mi sembra decisamente grave).
Ho incontrato il problema nello sviluppo di un'applicazione più grande, ma sono riuscito a riprodurlo anche con un semplicissimo progetto WPF.
Lo scopo del pezzo di codice è di eliminare i decimali non significativi da un numero (nell'esempio tengo solo il primo decimale).
Per riprodurre il problema ho creato una semplicissima applicazione WPF, il cui codice xaml della finestra principale è
<Window x:Class="TestArrotondamento.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="100" Width="300">
<DockPanel>
<TextBox Name="txtValue1" DockPanel.Dock="Top" />
<TextBox Name="txtValue2" DockPanel.Dock="Top" />
<Button Name="btnClick" Content="Click" Click="btnClick_Click" />
</DockPanel>
</Window>
ed il cui codice c# associato è
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace TestArrotondamento
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void btnClick_Click(object sender, RoutedEventArgs e)
{
Single value = Single.Parse(this.txtValue1.Text);
Single roundedValue = this.RoundValue(value);
this.txtValue2.Text = String.Format("{0:F1}", roundedValue);
}
private Single RoundValue(Single value)
{
Single roundedValue = value * 10;
roundedValue = Convert.ToSingle(Math.Truncate(roundedValue));
roundedValue /= 10;
return roundedValue;
}
}
}
Compilatelo sia in Debug che in Release, lanciate i due eseguibili da file system (NON eseguiteli all'interno di VS, altrimenti il problema non si verifica) e in entrambi scrivete il numero 24.8 nella prima TextBox. Cliccando sul pulsante avrete 24.8 nell'exe di Debug e 24.7 nell'exe di Release!!!
Non riesco a capire cosa succeda, spero che qualcuno mi chiarisca le idee, perchè non ne vedo un motivo chiaro.
Il problema è facilmente aggirabile scrivendo il numero con le cifre desiderate e facendone il Parse, ma il fatto che uno stesso pezzo di codice si comporti in due maniere diverse se compilato in Debug o Release non mi fornisce molta fiducia, considerando anche che la stragrande maggioranza del codice che sviluppo è per l'analisi di segnali numerici!
Grazie mille,
ciao