如何强制表达式的计算类型为 double

how to enforce the evaluation type of an expression to be double

提问人:yy uu 提问时间:6/14/2022 最后编辑:D Stanleyyy uu 更新时间:6/15/2022 访问量:192

问:

我怎么能确保表达式总是被评估为双精度,即使它没有双精度,我 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/floating-point-numeric-types 遇到了这个网站,它说:

check the relevant part from here那么我怎样才能覆盖这个问题并确保表达式始终被计算为双精度,

我正在尝试使用 Flee 库,每当我在其中放入一个分数(4/3)时,它都会将其处理为整数,甚至不是浮点数,这会破坏整个计算,所以我必须解决这个问题,

如果我尝试使用以下表达式,它会起作用

(4.0/3) 或 (4/3.0) = 1.33333 故障情况如下 (4/3) = 1 希望我的解释很清楚

C# WinForms 浮点 精度 FLEE

评论

1赞 Charlieface 6/14/2022
这回答了你的问题吗?C# 本身正在四舍五入除法
0赞 yy uu 6/15/2022
@Charlieface不幸的是它没有,这效果很好,但是当我将它与 Flee 库一起使用时,它会崩溃,因为我试图允许用户输入包含变量的数学表达式,Flee 的解析器将 d 视为变量并崩溃,我正在考虑一种解决方案,可以使所有数学评估以双倍方式完成, 就像完全取消整数除法一样。

答:

1赞 emagers 6/14/2022 #1

正如文档中提到的,这是该语言的一个特性。您始终可以将分子或分母转换为浮点数或双精度值,这将以相同类型的结果结束:

int a = 4;
int b = 3;
double result = (double)a / b;

评论

0赞 yy uu 6/15/2022
这效果很好,但是当我将它与 Flee 库一起使用时,它会崩溃,因为我试图允许用户输入包含变量的数学表达式,Flee 的解析器将 d 视为变量并崩溃,我正在考虑一种解决方案,可以使所有数学计算以双倍方式完成,例如完全取消整数除法。
0赞 Hervé 6/14/2022 #2

解决方案 1

使用 double 注释,它告诉编译器该数字实际上是双精度

4d / 3

(d 表示双精度,也适用于使用 f 的浮点数)

解决方案 2

使用显式强制转换

(double)4 / 3

评论

0赞 yy uu 6/15/2022
这效果很好,但是当我将它与 Flee 库一起使用时,它会崩溃,因为我试图允许用户输入包含变量的数学表达式,Flee 的解析器将 d 视为变量并崩溃,我正在考虑一种解决方案,可以使所有数学计算以双倍方式完成,例如完全取消整数除法。
1赞 yy uu 6/15/2022 #3

我设法通过强制 Flee Library 不再将任何给定的输入视为整数来解决这个问题,我通过编写以下代码来做到这一点:

ExpressionContext context = new ExpressionContext();
context.Options.IntegersAsDoubles = true;

祝大家好运