2016-12-12 1 views
0

그래서 디스플레이의 너비를 나누는 중입니다. 그 결과 깨끗한 숫자가 아닙니다.숫자를 십진수와 결합하고 int로 다시 변환하는 올바른 방법은 무엇입니까?

내 현재 해결 방법은 오른쪽을 떨어 뜨려 타일 생성을위한 패딩으로 사용하는 것입니다. 나는 숫자 336.75 (4로 나눈 1366 모니터 마이너스 스크롤 막대)

을받을 경우

그래서 예를 들어, 내가 문자열로 숫자를 변환 한 후 분할 방법을 사용하여 분할합니다.

문제는 오른쪽에 소수를 다시 가질 수 없다는 것입니다.

사용 :

var testNumber = 336.75, 
    numString = testNumber.toString(), 
    numParts = numString.split('.'), 
    numLeft = numParts[0], 
    numRight = numParts[1]; 

나는이 같은 소수에 다시 오른쪽 다리를하려고하면 :

var newNum = parseInt('.'+numRight); 

내가 NaN의 결과를 얻을.

나는 0.75 숫자를 가져 와서 패딩으로 사용하고 싶습니다.

지금은 마치 누락 소수점이 없기 때문에 .75이 숫자 75 인 것처럼 보입니다.

에서는 parseFloat 당신이 parseFloat()를 사용하는 경우 실제로 작동합니까 시도했다

+0

[JavaScript로 숫자의 소수 부분 표시] 가능한 복제본 (http://stackoverflow.com/questions/4512306/get-decimal-portion-of-a-number-with-javascript) –

+0

나중에 참조 할 수 있도록 ,'parseInt'는'string'을 취하고 숫자가 아닌 문자가 발견 될 때까지 숫자를 읽거나 저장합니다. 따라서'parseInt ("."+ num)'은 문자열 ".75"를 읽으려고 시도하고,'. '문자는 보이고 종료되어'NaN'을 반환합니다. 'parseFloat'는 문자열에'. '이있을 것으로 기대하기 때문에 작동합니다. –

+0

타입 캐스팅을 사용할 수도 있습니다 :'Number ('.'+ numRight); ' – BenM

답변

2

음을 작동하는 것 같다 (이 jsFiddle 참조)하지만, 당신이 뭘 하려는지 달성하기 위해 더 나은 및 더 효율적인 방법이 .

testNumber을 반올림하여 패딩 값을 쉽게 얻을 수 있습니다. 수의 modulus을 얻기

var testNumber = 336.75, 
    padding = testNumber - Math.floor(testNumber); // padding == 0.75 

도 가능성이지만, 덜 읽을 수 있습니다 : 당신은 당신을 위해 무거운의 대부분을 할 Math.floor()을 사용할 수 있습니다

var testNumber = 336.75, 
    padding = testNumber % 1; // padding == 0.75 
+0

감사합니다. 바닥/천장을 사용하는 것에 대해 궁금했지만 반올림으로 값을 잃어 버릴 염려가있었습니다. 타일을 면도하지 않고 픽셀을 유지하고 나머지는 패딩으로 사용할 수있게 최대한 가까이하려고했습니다. overflow-x를 켜야하기 때문에 여전히 좋은 해결책으로 보이지 않습니다. 숨기기를 사용하면 가로 스크롤이 표시되지 않습니다. –

+0

당신은'box-sizing '을 올바르게 사용하지 않을 수도 있지만, 더 많은 코드를 보지 않아도 평가하기가 어렵습니다. – BenM

+0

"올바르게"는 무엇을 의미합니까? body 태그의 코드 상단에 "box-sizing"테두리 상자를 추가했지만 CSS 재설정 파일을 구현했습니다. –

2

훨씬 더 간단합니다 :

var testNumber = 336.75; 
var padding = testNumber % 1; // 0.75 

편집 : commen의 논의 사항에 따라
재미 있고 (짜증나는) 문제는 간단한 부동 소수점 연산으로 12 자리의 결과를 얻는 것입니다. 예를 들어 2.3을 입력하면 0.3이 표시됩니다.
2.3 % 1 = 0.299999999998 .... 무엇?!

같은 일이 다른 대답의 솔루션을 발생합니다
2.3 - Math.floor(2.3) = 0.29999999998 .... :(

물리적으로 저장하는 방법을 부동 소수점 값으로해야 할 것으로 보인다. 자세한 내용은 이것 좀보세요 :

(2.3 % 1).toFixed(4); // "0.3000" 

을 또는 문자열이 아닌 숫자로 : Is floating point math broken?


을 최종 솔루션으로, 당신은 toFixed(n) 사용할 수

parseFloat((2.3 % 1).toFixed(4)); // 0.3 

합법적으로 소수점 이하 4 자리가있는 숫자에 약간의 정확도를 잃지 만, 2.3456789 -> 2.3457

+0

나는 이것을 전에 시도했지만 12 개 정도있는 결과를 리턴했다. 그 대신에 1이 2가 아닌 한. –

+0

@JacobDavidCunningham 방금이 연구를했습니다 ... 모듈러스는 정수로만 사용해야합니다. 반올림 오류는 부동 소수점을 메모리에 저장하는 방식 때문에 부동 소수점에 모듈러스를 사용할 수있는 언어에서 매우 일반적입니다. 자세한 내용은 http://stackoverflow.com/questions/588004/is-floating-point-math-broken을 참조하십시오. 그러나 Math.floor는 더 이상 신뢰할 수 없습니다. 내가 편집 할게. –

+0

문제 없습니다. 알려 줘서 고마워. 이 시점에서 나는 parseFloat를 사용할 것이다. 당신의 노력에 감사드립니다. –

관련 문제