给定浮点数a,b(保证输入有小数点,保证小数点后有9位数字),输出浮点数a*b,精确到小数点后9位。
0.000000000<=a,b<=99999999.999999999
看看就知道99999999.999999999超double范围了,这里采用字符串输入,也可以用 int+char+int输入方式,’.'看作char
(其实有long double,比double还大一点点,但也不够)
#include<iostream>
#include<string>
using namespace std;
string s1,s2;
int f1,f2;
long long a=0,b=0,c=0,d=0,ans1=0,ans2=0;
int main(){
cin>>s1>>s2;
for(int i=1;i<=s1.length() ;i++){
f1 = i-1;
if(s1[i-1]=='.') break;
a = a*10+s1[i-1]-'0';
// cout<<s1[i-1]-'0'<<endl;
}
// cout<<a<<endl;
for(int i=1;i<=s2.length() ;i++){
f2 = i-1;
if(s2[i-1]=='.') break;
b = b*10+s2[i-1]-'0';
}
// cout<<b<<endl;
for(int i=f1+2;i<=s1.length() ;i++){
c = c*10+s1[i-1]-'0';
}
// cout<<c<<endl;
for(int i=f2+2;i<=s2.length() ;i++){
d = d*10+s2[i-1]-'0';
}
// cout<<d<<endl;
ans1 = a*b;
// cout<<ans1<<endl;
ans1 = ans1+(a*d)/1000000000;
ans1 = ans1+(c*b)/1000000000;
ans2 = (a*d)%1000000000+(c*b)%1000000000
+(c*d+500000000)/1000000000;
//注意位数是固定了的,所以放心除
// 注意这里加了500000000!!!!!是要进位的你的小数!!!
// cout<<b<<" "<<d<<" "<<b*d<<endl;
// cout<< (a*d)%1000000000<<" "<<(c*b)%1000000000<<" "<<(b*d)/1000000000<<endl;
// cout<<ans2<<endl;
ans1 += ans2/1000000000;
// ans2 += 500000000;
ans2 %= 1000000000;
cout<<ans1<<'.';
printf("%09lld",ans2);
return 0;
}