c语言舍入到最接近的整数,JavaScript 字符串处理 | 精确四舍五入 | 保留两位小数 | 为什么牛客网提示没有输入输出数据...

下午手贱JavaScript写了个题,当然了最后也没通过,不是我代码问题,我换了三个四个浏览器,输出都没问题,但是提交OJ的判定系统就说我没有输出😢,(当然这个为题解决了,看下边)

牛客网提示没有输入输出数据

我一下午都在疑惑为什么说我没输入输出,因为牛客网的判题系统问题,JavaScript输入我用的是prompt(),后来查了官方,官方说要用readline()输入。😃 无语了。

牛客网JavaScript V8引擎是利用了readline()接收输入的每一行,该行字符数不能超过1024个。在这里readline是可以重载的,也就是说每一次调用readline()就会识别一行输入数据,多行输入其实就是写多个readline()即可。

牛客网输出函数用print()和console.log()都可以,但是document.write()不行哦,会提示超时。

99870d1bece4bb3fb9e84894d29ced38.png

题目

题目描述

依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号,3科成绩。

输入描述:

学号以及3科成绩,学号和成绩之间用英文分号隔开,成绩之间用英文逗号隔开。

输出描述:

学号,3科成绩,输出格式详见输出样例。

示例1

输入

17140216;80.845,90.55,100.00

输出

The each subject score of No. 17140216 is 80.85, 90.55, 100.00.

答案

C语言答案

当然了这个题用C语言写很简单,代码如下:

#include

int main()

{

long s;

float a,b,c;

scanf("%d;%f,%f,%f",&s,&a,&b,&c);

printf("The each subject score of No. %d is %.2f, %.2f, %.2f.\n",s,a,b,c);

}

JavaScript答案

var str = readline();

var result = "The each subject score of No. "; //使用result来保存结果是因为后面的步骤中,否则控制台无法在一行中输出

var pos = str.search(";"); //找到;

result += str.slice(0, pos);//分出学号

result += " is ";

str = str.slice(pos + 1, str.length);//把学号从字符串中裁掉

var StrArray = new Array();//定义数组

StrArray = str.split(","); //剩余部分字符串按照`,`分割

for(i = 0; i < StrArray.length; i++) {//存入数组中

StrArray[i] = +StrArray[i];

StrArray[i] = Math.round(StrArray[i] * 100) / 100.; //四舍五入

StrArray[i] = StrArray[i].toFixed(2); //保留两位小数 ,避免100.00只显示100的情况

if(i != StrArray.length - 1)

result += StrArray[i] + ",";

else

result += StrArray[i] + ".";

}

document.write(result);//网页输出 输出,二选一即可,a题过程中建议用

console.log(result);//控制台输出 输出,二选一即可,a题过程中建议用

JavaScript字符串处理总结

学过其他语言的理解起来应该会很方便,字符串可以是插入到引号中的任何字符。你可以使用单引号或双引号

字符串属性

属性

描述constructor

对创建该对象的函数的引用

length

字符串的长度

prototype

允许您向对象添加属性和方法

字符串方法

属性

描述

示例:var str = "HELLO WORLD";

输出toString()

返回一个字符串。

charAt()

返回在指定位置的字符。

var n = str.charAt(1)

E

concat()

连接两个或更多字符串,并返回新的字符串。

var n = str.concat("!");

HELLO WORLD!

search()

查找与正则表达式相匹配的值。

str.indexOf("ld");

9

indexOf()

返回某个指定的字符串值在字符串中首次出现的位置。

str.indexOf("L");

2

includes()

查找字符串中是否包含指定的子字符串。

var n=str.includes("ld");

var n=str.includes("llo",10);

true

false

lastIndexOf()

从后向前搜索字符串,并从起始位置(0)开始计算返回字符串最后出现的位置。

replace()

在字符串中查找匹配的子串, 并替换与正则表达式匹配的子串。

str = str.replace("HELLO","hi");

hi WORLD

slice()

提取字符串的片断,并在新的字符串中返回被提取的部分。

var n1=str.slice(1,5);

var n2=str.slice(4);

ELLO

O WORLD

substr()

从起始索引号提取字符串中指定数目的字符。

var n2=str.substr(1,5);

ELLO

substring()

提取字符串中两个指定的索引号之间的字符。

var n1=str.substring(1,5);

ELLO

split()

把字符串分割为字符串数组。

var n=str.split(" ");

HELLO,WORLD

startsWith()

查看字符串是否以指定的子字符串开头。

toLowerCase()

把字符串转换为小写。

str.toLowerCase()

hello world

toUpperCase()

把字符串转换为大写。

toLocaleLowerCase()

根据本地主机的语言环境把字符串转换为小写。

toLocaleUpperCase()

根据本地主机的语言环境把字符串转换为大写。

trim()

去除字符串两边的空白

var str = " aaa aaa   "

aaa aaa

valueOf()

返回某个字符串对象的原始值。

charCodeAt()

返回在指定的位置的字符的 Unicode 编码。

fromCharCode()

将 Unicode 编码转为字符。

match()

查找找到一个或多个正则表达式的匹配。

repeat()

复制字符串指定次数,并将它们连接在一起返回。

str = str.repeat(3);

Hello worldHello worldHello world

保留两位小数

.toFixed()银行家舍入法

许多人会说用这个来四舍五入,但是使用的是银行家舍入法,并不符合我们常理中的四舍五入,因此想精确四舍五入看方法3

5b4b20906ced12b52f2f2d5b739df68e.png

不四舍五入

2.1 向下取整,先把小数变整数:

Math.floor(15.7784514000 * 100) / 100 //输出结果为 15.77

2.2 先将数据转换为字符串,最后再转为数值类型

Number(15.7784514000.toString().match(/^\d+(?:\.\d{0,2})?/)) // 输出结果为 15.77,不能用于整数如 10 必须写为10.0000

注意:如果是负数,请先转换为正数再计算,最后转回负数

精确的四舍五入

toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则,这种规则不符合我们平常在数据中处理的方式。为了解决这样的问题,提出两种方法:

1. Math.round方法

round()方法可把一个数字舍入为最接近的整数,也就是我们意义上的四舍五入,但是只能取整数部分。

因此我们可以将数字扩大两倍,使用round()获得四舍五入得到的整数部分,然后再除100即可。

Math.round(num* 100) / 100.

但是如果要保留两位小数,一定要加上num = num.toFixed(2),这样可以防止小数部分为0的数字只显示整数部分,例如99.00只显示99。

Math.round(num* 100) / 100.

num = num.toFixed(2);

b0c769cc8ef3b2c6c7f7c37faac44856.png

5e5bfffd6b454a73f98c3b3b4f101882.png

Math.round(x),它虽然不会产生精度问题,但是它有一点小陷阱容易忽略。下面是它的舍入的策略:

如果小数部分大于 0.5,则舍入到下一个绝对值更大的整数。

如果小数部分小于 0.5,则舍入到下一个绝对值更小的整数。

如果小数部分等于 0.5,则舍入到下一个正无穷方向上的整数。

所以,对 Math.round(-1.5),其结果为 -1,这可能不是我们想要的结果。因此负数时候要分开讨论。

2.重定义toFixed()

由于toFixed()是银行家舍入法,我们可以重新写一个toFixed(),代码如下直接复制即可。

num = num.toFixed(2);

Number.prototype.toFixed = function(d) {

var s = this + "";

if(!d) d = 0;

if(s.indexOf(".") == -1) s += ".";

s += new Array(d + 1).join("0");

if(new RegExp("^(-|\\+)?(\\d+(\\.\\d{0," + (d + 1) + "})?)\\d*$").test(s)) {

var s = "0" + RegExp.$2,

pm = RegExp.$1,

a = RegExp.$3.length,

b = true;

if(a == d + 2) {

a = s.match(/\d/g);

if(parseInt(a[a.length - 1]) > 4) {

for(var i = a.length - 2; i >= 0; i--) {

a[i] = parseInt(a[i]) + 1;

if(a[i] == 10) {

a[i] = 0;

b = i != 1;

} else break;

}

}

s = a.join("").replace(new RegExp("(\\d+)(\\d{" + d + "})\\d$"), "$1.$2");

}

if(b) s = s.substr(1);

return(pm + s).replace(/\.$/, "");

}

return this + "";

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值