我有一个案例,我在Float对象上做一些数学运算,当我调用to_i时,它被减少一个.
value = 0.29 * 100
value.to_i
=> 28
Run Code Online (Sandbox Code Playgroud)
我知道浮点数是不精确的表示,但这比我预期的要多.发生了什么事,我该如何防止这种情况发生?
我正在使用ruby 1.8.7(它也发生在1.8.6).
我正在设计一个收银机,我必须比较2个浮点值,每次比较时我都会收到错误.ie因为我无法将最多2位小数的差值四舍五入并将其与值进行比较.
例如.如果客户支付的金额为60.36且发出的账单为30.24,则差异为30.120001.我甚至尝试使用floor函数将其四舍五入为二位数:floorf(diff*100 + .5)/ 100; 但它不起作用.
我应该如何舍入十进制数字并将其用于设计收银机?
在Boost中实现了erf功能

<boost/math/special_functions/erf.hpp>我们有一个标题
result = z * 1.125 + z * 0.003379167095512573896158903121545171688L;
Run Code Online (Sandbox Code Playgroud)
在下面附带的代码段中.我的问题是:为什么没有
大号
这个加法的第一个组成部分中的长后缀,而第二个中有一个?它背后的理由是什么?它带来了什么影响?
template <class T, class Policy>
T erf_imp(T z, bool invert, const Policy& pol, const mpl::int_<113>& t)
{
BOOST_MATH_STD_USING
BOOST_MATH_INSTRUMENT_CODE("113-bit precision erf_imp called");
if(z < 0){
if(!invert)
return -erf_imp(-z, invert, pol, t);
else if(z < -0.5)
return 2 - erf_imp(-z, invert, pol, t);
else
return 1 + erf_imp(-z, false, pol, t);
}
T result;
// Big bunch of selection statements now
if(z < 0.5){
// …Run Code Online (Sandbox Code Playgroud) 什么样的错误?我该如何解决?
1.1 - 1 = 0.10000000000000009
1.0000001+1 = 2.0000001000000003
我知道如何检查两个浮点数是否almost相等,简单代码:
bool compare(double a, double b)
{
if(fabs(a - b) < (1.0 / 10000000))
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
但是当我有一些随机数据时,让我们说9.0和9.5,或者9.4我希望将它们视为相同数字,如何做到这一点?我的意思是,他们不相等,但我可以允许一些小错误+/- 0.5.有任何想法吗?
有了这个错误,我可以处理数字:
9.1 and 9.0
3.1 and 3.6
-4.2 and -4.6
Run Code Online (Sandbox Code Playgroud)
平等的
我有一个(也许)愚蠢的问题.
我的数据:文件1
1234.34 a 1235.34 d
3456.23 b 3457.23 e
2325.89 c 2327.89 f
Run Code Online (Sandbox Code Playgroud)
我想要类似的东西
awk '{if($1==$3) print $4}'
Run Code Online (Sandbox Code Playgroud)
但是当然如果我这样做,它什么都不会打印出来.所以我想修改$ 3的"精度"(在这种情况下)
从某种意义上说,当awk读取$ 3时,它会发现:
124
345
232
Run Code Online (Sandbox Code Playgroud)
那它必须是一种方法来做到这一点,但我不知道.
awk '{if($1==(three digits precision $3)) print $4}'
Run Code Online (Sandbox Code Playgroud)
救命?
还有,为什么浮点不应使用货币的操作和可爱的例子给出的SO的大讨论在这里从Bloch的Effective Java的.
我正在玩这个,发现一些奇怪的东西.如果数字是双倍的:
System.out.println(1.03d - .42d);
//prints out 0.6100000000000001.
Run Code Online (Sandbox Code Playgroud)
但是,如果数字是浮点数:
System.out.println(1.03f - .42f);
//prints out 0.61.
Run Code Online (Sandbox Code Playgroud)
为什么这对浮子也不会以同样的方式失败?两种类型都容易出现同样的问题,但是导致行为差异的原因是什么?
我必须将整数值乘以 2^31。我用谷歌搜索了一下,看起来双打的范围在 2.23e-308 <= |X| 之间 使用 64 位时 <= 1.79e308,并且是 1.18e-38 <= |X| 之间的浮点数 <= 3.40e38。
这比我需要的要多得多。但这不起作用。
我的头文件中有这个常量值:
static const float SCALE_FACTOR = 2^-31;
Run Code Online (Sandbox Code Playgroud)
如果那么我就这样做:
float dummy = SCALE_FACTOR;
Run Code Online (Sandbox Code Playgroud)
那么,dummy 的值为 11。
我不知道问题是否在于分配这样的常量值,但我不知道如何在不损失精度的情况下编写它。
有什么帮助吗?
编辑:抱歉,愚蠢的问题。我的 MatLab 背景背叛了我,忘记了 ^ 在 C++ 中不是用于求幂。我已投票结束。
c++ floating-point double double-precision floating-point-precision
我正在is_float()检查输入的数字是否是浮点数,但echo()输入时它会不断抛出该消息3.00。还有其他解决方案吗?还是我做错了什么?
这是我的代码:
PHP:
if(!is_float($_POST["gpa"])){
echo "GPA must be in #.## format.";
}
Run Code Online (Sandbox Code Playgroud)
HTML:
<input type="text" name="gpa" />
Run Code Online (Sandbox Code Playgroud) 我在python中尝试了这个简单的数学运算
>>> math.floor(8.2-0.21)
7.0
>>> math.floor(8.21-0.2)
8.0
>>> math.floor(8.2-0.2)
7.0
Run Code Online (Sandbox Code Playgroud)
第三个应该返回8但是返回7?!
UPDATE
我在PHP,ruby和JAVA中尝试过,我得到了相同的结果.
更新2 我不知道为什么这个问题得到很多投票!
我想知道如何在long double中重新创建一个值.是L还是LF.我问这个,因为在某些地方我读过它是L和一些LF.在其中一个考试答案和一些像indiabix这样的网站中它是L并且在一些堆栈溢出帖子中它的LF.
我的问题更多是关于为什么在C++,C#和VB中
std::cout<<2.2f*3.0f<<std::endl; //prints 6.6
Run Code Online (Sandbox Code Playgroud)
在Python,Java和Ruby中
2.2*3.0 //prints 6.6000000000000005
Run Code Online (Sandbox Code Playgroud)
我对内存中的浮点表示非常熟悉.我检查过,事实上2.2无法用单精度精确表示在内存中.
但是为什么C++,C#和VB在打印值时会切断结果中不相关的部分而其他部分却没有?
我已经在android上制作了一个计算器应用程序,但每当我做一些这样的乘法:
23.3 x 3.3
Run Code Online (Sandbox Code Playgroud)
我得到的答案是这样的:
76.988999999999
Run Code Online (Sandbox Code Playgroud)
现在请告诉我如何使用此应用程序解决此冲突.答案应该是这样的
76.89
Run Code Online (Sandbox Code Playgroud) java double android floating-accuracy floating-point-precision