質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

834閲覧

javascriptで上二桁目を繰り上げしたい

sususu

総合スコア99

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/01/16 15:58

どなたかご教授頂ければ幸いです。
表題の件の通りなのですがjavascriptで上二桁目を繰り上げし
上二桁目以降はすべて0にしたいです。
取得される値はバラバラです。例えば下記のとおりです。
加工する数値に小数点以下はありません。

1000→1000
1200→2000
999 →1000
1999→2000
9 →10(一桁のものは10)

私が考えている方法は下記のとおりです。
→10の(桁-1)乗で出た値で、該当の数値を割る
→ceilをかけて繰り上げをする
→割った数字をかけて元に戻す

例1.1200の場合
10の3乗(4桁-1) = 1000
1200 / 1000 = 1.2
ceil(1.2) = 2
2 * 1000 = 2000

例2.999の場合
10の2乗(3桁-1) = 100
999 / 100 = 9.99
ceil(9.99) = 10
10 * 100 = 1000

上記のように考えているのですが、ほかにもっと良い方法はありますでしょうか。
探していてもroundやceilの説明ばかりが出てきてしまい、あまりほかのアイデアが浮かびません。
y = 10^(length-1)
x = x / y
x = Math.ceil(x)
x = x * y

是非皆さんの意見を伺わせていただけますでしょうか。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/01/17 00:39

2001は2000なのでしょうか3000なのでしょうか? 仮に2000だとすると2099も2000ですか? > 一桁のものは10 1は10なのですか? また、9は10で、90が90っていうのは合理的ではないですが・・・
sususu

2020/01/17 02:07

ご指摘ありがとうございます。 そこら辺まで使用を考えていませんでした。 一度検討して質問を修正させて頂きます。
yambejp

2020/01/17 02:09

一応回答つけてあるので参考にしてください
guest

回答3

0

ベストアンサー

こういうことだと思うんですが条件がちょっとわかりづらいです

投稿2020/01/17 02:08

yambejp

総合スコア114759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/01/17 02:08

var n; var nums=[1000,1200,2000,2001,999,1999,1,9] for(var num of nums){ console.log([num,(n=Math.ceil(num/(n=10**(parseInt(Math.log10(num)))))*n)<10?10:n]); }
yambejp

2020/01/17 02:18

一応解説するとこう var n; var nums=[1000,1200,2000,2001,999,1999,1,9] for(var num of nums){ var n1=parseInt(Math.log10(num));//桁数を数える var n2=10**n1;//割る数を決める var n3=Math.ceil(num/n2);//割ってから切り上げ var n4=n3*n2;//割った数をかける var n5=n4<10?10:n4;//10以下は10 console.log([num,n5]); }
sususu

2020/01/17 02:19

ありがとうございます。 2001など想定せずに質問していたにも関わらず、それをくみ取った上でご回答いただきありがとうございました。 パターンも網羅していただき、値の加工の前後がわかるようにしていただきとても助かりました。 今回ベストアンサーとして選ばせて頂きます。
sususu

2020/01/17 02:20

解説まで頂きありがとうございます。 js、数字に不慣れなので一行ずつ確認させて頂きます!
guest

0

正規表現と数値⇔文字列を繰り返すので、良い方法かと言われると微妙ですが。。。

js

1var x = 1000; //任意の自然数 2if(/^[0-9]0[0-9]*$/.test(a)){ //前から2桁目が0の場合 3 x = (Number(String(a).slice(0,1)))*10**(String(a).length-1); //切り捨て 4}else{ //前から2桁目が0以外の場合 5 x = (Number(String(a).slice(0,1))+1)*10**(String(a).length-1); 6}

あと小数を扱う場合や負の値を扱う場合は使えません。

投稿2020/01/16 16:46

yuuyu

総合スコア1135

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sususu

2020/01/17 02:03

ご指摘いただきありがとうございます。文字列をなるべく使わない方法で検討してみます。 ご回答いただいて申し訳ございませんが、私の想定外でご指摘があった通り2001などをどう言った仕様にするか決めておりませんでした。 少しそちらを検討させて頂いてからこの質問を閉じさせていただきたいと思います。 ありがとうございます。
guest

0

ちと出先なので動くか確認できてないですが、こんな感じになるのではないかと思います

Jan 17, 2020 PM1:10追記 動いていなかったので修正

js

1const rounded = [ 2 1000, 3 1200, 4 999, 5 1999, 6 9, 7 112.35813, 8 -14142.1356 9].map(x => roundUpWithFirst2Digit(x)); 10document.write(`<ul><li>${rounded.join('</li><li>')}</li></ul>`); 11/* 121000 131200 141000 152000 1610 17120 18-14000 19*/ 20 21function roundUpWithFirst2Digit(x) { 22 const digitLength = ('' + Math.abs(Math.trunc(x))).length; 23 switch(digitLength) { 24 case 0: throw new Error('invalid input value'); 25 case 1: return 10; 26 default: 27 const multi = 10 ** (digitLength - 2); 28 return Math.ceil(x / multi) * multi; 29 } 30}

投稿2020/01/17 00:50

編集2020/01/17 04:12
thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thyda.eiqau

2020/01/17 00:52

やべーコードブロックできてない……PC触れるようになったら直しておきます
sususu

2020/01/17 02:09

PC触れない状態にもかかわらずありがとうございます。 ご回答いただいたにもかかわらず申し訳ありませんが、下記の通りご指摘を受けまして、 想定がいでした。 コメント: 2001は2000なのでしょうか3000なのでしょうか? 仮に2000だとすると2099も2000ですか? > 一桁のものは10 1は10なのですか? また、9は10で、90が90っていうのは合理的ではないですが・・・ 仕様を考え直し質問を修正させて頂きます。 どうぞよろしくお願いいたします。
thyda.eiqau

2020/01/17 04:12

解決されたようですがコードブロックの修正とあわせて、コードそのものが動いていなかったので直しました。
sususu

2020/01/17 05:16

お忙しいところご回答いただきありがとうございました! コードの方は意見させて頂きます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問