【问题标题】:C# float.Parse losing precision [duplicate]C# float.Parse 失去精度 [重复]
【发布时间】:2017-11-04 05:36:00
【问题描述】:

我在将数据库中获取的数据转换为浮点数时遇到了一些麻烦。基本上,该应用程序将我的一个值四舍五入到小数点后一位。该表包含一组具有货币值的字段,其中一个值由应用程序进行四舍五入。最奇怪的是,尽管我的数据库中有更多浮点值,但其中只有一个是四舍五入的(valorAtualizadoAcordo)。所以,这是我的查询:

SELECT 
    idAcordo,
    tipoAcordo,
    valorAtualizadoAcordo,
    dataAtualizacaoAcordo,
    valorConfessadoAcordo,
    valorAcordo,
    valorEntradaAcordo,
    valorParceladoAcordo,
    quantidadeParcelasAcordo,
    taxaAcordo,
    atualizacaoTrAcordo,
    dataPrimeiraParcelaAcordo,
    dataUltimaParcelaAcordo,
    dataAssinaturaAcordo,
    dataAprovacaoAcordo,
    primeiraDataAbertoAcordo,
    dataProtocoloAcordo,
    tipoProtocoloAcordo,
    cadastroDspsAcordo,
    dataSolicitacaoAcordo,
    contabilizadoAcordo,
    dataLancamentoAcordo,
    contratoDevolvidoAcordo,
    dataDevolucaoAcordo,
    volumetriaAcordo,
    pagamentoRealizadoDataAcordo,
    contratoAntesAjuizamentoDataAcordo 
FROM 
    acordo 
WHERE 
    FK_idContrato = 46;

这是我的转变:

ac.setValor(float.Parse(acd.Rows[i][5].ToString(), CultureInfo.InvariantCulture));

我试图从数据库中检索的值是 325,360.69。我正在将其转换为 PT-BR 格式,这给了我“325360,7”(在巴西,我们使用“,”而不是“.”来定义十进制浮点数)。

【问题讨论】:

  • float 的精度大约为 7 位。您需要使用 double 代替。
  • 来自Single 上的文档:单个值具有最多 7 位十进制数字的精度,但内部最多保留 9 位数字。这意味着某些浮点运算可能缺乏更改浮点值的精度。
  • 我推荐你使用float.TryParse,这样你可以检查数据库的值是否适合浮点容量。相反,你必须使用 double
  • 这似乎是为decimal 创造的那种情况?
  • 如果您使用“货币价值”,您应该使用 base-10 decimal 而不是 base-2 floats。

标签: c# floating-point type-conversion precision


【解决方案1】:

不知道为什么你认为从浮点数和返回字符串是一个好主意,但我会先删除ToString。使用强制转换或真正的转换方法,如convert.ToFloat

float f = (float)acd.Rows[i][5];

或者:

float f = Convert.ToFloat(acd.Rows[i][5]);

【讨论】:

  • 当我尝试这样做时,它给了我一个错误:“InvalidCastException 未处理”
  • 第一个还是第二个?第二个应该更安全(失败时的价值是什么?)。此外,实际类型可能是 decimal,这是一种更好的货币值数据类型。
  • @PatrickPierre 你解决了这个问题吗?需要更多帮助?
  • 是的,我做到了。我使用十进制而不是浮点数,并且工作正常。
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 2015-09-04
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2011-03-17
  • 2014-12-09
  • 1970-01-01
相关资源
最近更新 更多